1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefix=RV32I %s 4; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \ 5; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-NOZACAS,RV32IA-WMO,RV32IA-WMO-NOZACAS %s 6; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-NOZACAS,RV32IA-TSO,RV32IA-TSO-NOZACAS %s 8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64I %s 10; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \ 11; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS,RV64IA-WMO,RV64IA-WMO-NOZACAS %s 12; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \ 13; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS,RV64IA-TSO,RV64IA-TSO-NOZACAS %s 14 15; RUN: llc -mtriple=riscv32 -mattr=+a,+zacas -verify-machineinstrs < %s \ 16; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS,RV32IA-WMO,RV32IA-WMO-ZACAS %s 17; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso,+zacas -verify-machineinstrs < %s \ 18; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS,RV32IA-TSO,RV32IA-TSO-ZACAS %s 19; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas -verify-machineinstrs < %s \ 20; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS,RV64IA-WMO,RV64IA-WMO-ZACAS %s 21; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zacas -verify-machineinstrs < %s \ 22; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS,RV64IA-TSO,RV64IA-TSO-ZACAS %s 23 24; RUN: llc -mtriple=riscv64 -mattr=+a,+zabha -verify-machineinstrs < %s \ 25; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO,RV64IA-WMO-ZABHA,RV64IA-WMO-ZABHA-NOZACAS %s 26; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zabha -verify-machineinstrs < %s \ 27; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO,RV64IA-TSO-ZABHA,RV64IA-TSO-ZABHA-NOZACAS %s 28; RUN: llc -mtriple=riscv64 -mattr=+a,+zabha,+zacas -verify-machineinstrs < %s \ 29; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO,RV64IA-WMO-ZABHA,RV64IA-WMO-ZABHA-ZACAS %s 30; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zabha,+zacas -verify-machineinstrs < %s \ 31; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO,RV64IA-TSO-ZABHA,RV64IA-TSO-ZABHA-ZACAS %s 32 33define i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind { 34; RV32I-LABEL: atomicrmw_xchg_i8_monotonic: 35; RV32I: # %bb.0: 36; RV32I-NEXT: addi sp, sp, -16 37; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 38; RV32I-NEXT: li a2, 0 39; RV32I-NEXT: call __atomic_exchange_1 40; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 41; RV32I-NEXT: addi sp, sp, 16 42; RV32I-NEXT: ret 43; 44; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic: 45; RV32IA: # %bb.0: 46; RV32IA-NEXT: andi a2, a0, -4 47; RV32IA-NEXT: slli a0, a0, 3 48; RV32IA-NEXT: li a3, 255 49; RV32IA-NEXT: andi a1, a1, 255 50; RV32IA-NEXT: sll a3, a3, a0 51; RV32IA-NEXT: sll a1, a1, a0 52; RV32IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 53; RV32IA-NEXT: lr.w a4, (a2) 54; RV32IA-NEXT: mv a5, a1 55; RV32IA-NEXT: xor a5, a4, a5 56; RV32IA-NEXT: and a5, a5, a3 57; RV32IA-NEXT: xor a5, a4, a5 58; RV32IA-NEXT: sc.w a5, a5, (a2) 59; RV32IA-NEXT: bnez a5, .LBB0_1 60; RV32IA-NEXT: # %bb.2: 61; RV32IA-NEXT: srl a0, a4, a0 62; RV32IA-NEXT: ret 63; 64; RV64I-LABEL: atomicrmw_xchg_i8_monotonic: 65; RV64I: # %bb.0: 66; RV64I-NEXT: addi sp, sp, -16 67; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 68; RV64I-NEXT: li a2, 0 69; RV64I-NEXT: call __atomic_exchange_1 70; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 71; RV64I-NEXT: addi sp, sp, 16 72; RV64I-NEXT: ret 73; 74; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i8_monotonic: 75; RV64IA-NOZACAS: # %bb.0: 76; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 77; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 78; RV64IA-NOZACAS-NEXT: li a3, 255 79; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 80; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 81; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 82; RV64IA-NOZACAS-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 83; RV64IA-NOZACAS-NEXT: lr.w a4, (a2) 84; RV64IA-NOZACAS-NEXT: mv a5, a1 85; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 86; RV64IA-NOZACAS-NEXT: and a5, a5, a3 87; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 88; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 89; RV64IA-NOZACAS-NEXT: bnez a5, .LBB0_1 90; RV64IA-NOZACAS-NEXT: # %bb.2: 91; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 92; RV64IA-NOZACAS-NEXT: ret 93; 94; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i8_monotonic: 95; RV64IA-ZACAS: # %bb.0: 96; RV64IA-ZACAS-NEXT: andi a2, a0, -4 97; RV64IA-ZACAS-NEXT: slli a0, a0, 3 98; RV64IA-ZACAS-NEXT: li a3, 255 99; RV64IA-ZACAS-NEXT: andi a1, a1, 255 100; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 101; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 102; RV64IA-ZACAS-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 103; RV64IA-ZACAS-NEXT: lr.w a4, (a2) 104; RV64IA-ZACAS-NEXT: mv a5, a1 105; RV64IA-ZACAS-NEXT: xor a5, a4, a5 106; RV64IA-ZACAS-NEXT: and a5, a5, a3 107; RV64IA-ZACAS-NEXT: xor a5, a4, a5 108; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 109; RV64IA-ZACAS-NEXT: bnez a5, .LBB0_1 110; RV64IA-ZACAS-NEXT: # %bb.2: 111; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 112; RV64IA-ZACAS-NEXT: ret 113; 114; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_monotonic: 115; RV64IA-WMO-ZABHA: # %bb.0: 116; RV64IA-WMO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 117; RV64IA-WMO-ZABHA-NEXT: ret 118; 119; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_monotonic: 120; RV64IA-TSO-ZABHA: # %bb.0: 121; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 122; RV64IA-TSO-ZABHA-NEXT: ret 123 %1 = atomicrmw xchg ptr %a, i8 %b monotonic 124 ret i8 %1 125} 126 127define i8 @atomicrmw_xchg_i8_acquire(ptr %a, i8 %b) nounwind { 128; RV32I-LABEL: atomicrmw_xchg_i8_acquire: 129; RV32I: # %bb.0: 130; RV32I-NEXT: addi sp, sp, -16 131; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 132; RV32I-NEXT: li a2, 2 133; RV32I-NEXT: call __atomic_exchange_1 134; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 135; RV32I-NEXT: addi sp, sp, 16 136; RV32I-NEXT: ret 137; 138; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_acquire: 139; RV32IA-WMO: # %bb.0: 140; RV32IA-WMO-NEXT: andi a2, a0, -4 141; RV32IA-WMO-NEXT: slli a0, a0, 3 142; RV32IA-WMO-NEXT: li a3, 255 143; RV32IA-WMO-NEXT: andi a1, a1, 255 144; RV32IA-WMO-NEXT: sll a3, a3, a0 145; RV32IA-WMO-NEXT: sll a1, a1, a0 146; RV32IA-WMO-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 147; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 148; RV32IA-WMO-NEXT: mv a5, a1 149; RV32IA-WMO-NEXT: xor a5, a4, a5 150; RV32IA-WMO-NEXT: and a5, a5, a3 151; RV32IA-WMO-NEXT: xor a5, a4, a5 152; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 153; RV32IA-WMO-NEXT: bnez a5, .LBB1_1 154; RV32IA-WMO-NEXT: # %bb.2: 155; RV32IA-WMO-NEXT: srl a0, a4, a0 156; RV32IA-WMO-NEXT: ret 157; 158; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_acquire: 159; RV32IA-TSO: # %bb.0: 160; RV32IA-TSO-NEXT: andi a2, a0, -4 161; RV32IA-TSO-NEXT: slli a0, a0, 3 162; RV32IA-TSO-NEXT: li a3, 255 163; RV32IA-TSO-NEXT: andi a1, a1, 255 164; RV32IA-TSO-NEXT: sll a3, a3, a0 165; RV32IA-TSO-NEXT: sll a1, a1, a0 166; RV32IA-TSO-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 167; RV32IA-TSO-NEXT: lr.w a4, (a2) 168; RV32IA-TSO-NEXT: mv a5, a1 169; RV32IA-TSO-NEXT: xor a5, a4, a5 170; RV32IA-TSO-NEXT: and a5, a5, a3 171; RV32IA-TSO-NEXT: xor a5, a4, a5 172; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 173; RV32IA-TSO-NEXT: bnez a5, .LBB1_1 174; RV32IA-TSO-NEXT: # %bb.2: 175; RV32IA-TSO-NEXT: srl a0, a4, a0 176; RV32IA-TSO-NEXT: ret 177; 178; RV64I-LABEL: atomicrmw_xchg_i8_acquire: 179; RV64I: # %bb.0: 180; RV64I-NEXT: addi sp, sp, -16 181; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 182; RV64I-NEXT: li a2, 2 183; RV64I-NEXT: call __atomic_exchange_1 184; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 185; RV64I-NEXT: addi sp, sp, 16 186; RV64I-NEXT: ret 187; 188; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_acquire: 189; RV64IA-WMO-NOZACAS: # %bb.0: 190; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 191; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 192; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 193; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 194; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 195; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 196; RV64IA-WMO-NOZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 197; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 198; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1 199; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 200; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 201; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 202; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 203; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB1_1 204; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 205; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 206; RV64IA-WMO-NOZACAS-NEXT: ret 207; 208; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_acquire: 209; RV64IA-TSO-NOZACAS: # %bb.0: 210; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 211; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 212; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 213; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 214; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 215; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 216; RV64IA-TSO-NOZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 217; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 218; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1 219; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 220; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 221; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 222; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 223; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB1_1 224; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 225; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 226; RV64IA-TSO-NOZACAS-NEXT: ret 227; 228; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_acquire: 229; RV64IA-WMO-ZACAS: # %bb.0: 230; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 231; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 232; RV64IA-WMO-ZACAS-NEXT: li a3, 255 233; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 234; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 235; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 236; RV64IA-WMO-ZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 237; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 238; RV64IA-WMO-ZACAS-NEXT: mv a5, a1 239; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 240; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 241; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 242; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 243; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB1_1 244; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 245; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 246; RV64IA-WMO-ZACAS-NEXT: ret 247; 248; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_acquire: 249; RV64IA-TSO-ZACAS: # %bb.0: 250; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 251; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 252; RV64IA-TSO-ZACAS-NEXT: li a3, 255 253; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 254; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 255; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 256; RV64IA-TSO-ZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 257; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 258; RV64IA-TSO-ZACAS-NEXT: mv a5, a1 259; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 260; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 261; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 262; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 263; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB1_1 264; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 265; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 266; RV64IA-TSO-ZACAS-NEXT: ret 267; 268; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_acquire: 269; RV64IA-WMO-ZABHA: # %bb.0: 270; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aq a0, a1, (a0) 271; RV64IA-WMO-ZABHA-NEXT: ret 272; 273; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_acquire: 274; RV64IA-TSO-ZABHA: # %bb.0: 275; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 276; RV64IA-TSO-ZABHA-NEXT: ret 277 %1 = atomicrmw xchg ptr %a, i8 %b acquire 278 ret i8 %1 279} 280 281define i8 @atomicrmw_xchg_i8_release(ptr %a, i8 %b) nounwind { 282; RV32I-LABEL: atomicrmw_xchg_i8_release: 283; RV32I: # %bb.0: 284; RV32I-NEXT: addi sp, sp, -16 285; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 286; RV32I-NEXT: li a2, 3 287; RV32I-NEXT: call __atomic_exchange_1 288; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 289; RV32I-NEXT: addi sp, sp, 16 290; RV32I-NEXT: ret 291; 292; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_release: 293; RV32IA-WMO: # %bb.0: 294; RV32IA-WMO-NEXT: andi a2, a0, -4 295; RV32IA-WMO-NEXT: slli a0, a0, 3 296; RV32IA-WMO-NEXT: li a3, 255 297; RV32IA-WMO-NEXT: andi a1, a1, 255 298; RV32IA-WMO-NEXT: sll a3, a3, a0 299; RV32IA-WMO-NEXT: sll a1, a1, a0 300; RV32IA-WMO-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 301; RV32IA-WMO-NEXT: lr.w a4, (a2) 302; RV32IA-WMO-NEXT: mv a5, a1 303; RV32IA-WMO-NEXT: xor a5, a4, a5 304; RV32IA-WMO-NEXT: and a5, a5, a3 305; RV32IA-WMO-NEXT: xor a5, a4, a5 306; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 307; RV32IA-WMO-NEXT: bnez a5, .LBB2_1 308; RV32IA-WMO-NEXT: # %bb.2: 309; RV32IA-WMO-NEXT: srl a0, a4, a0 310; RV32IA-WMO-NEXT: ret 311; 312; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_release: 313; RV32IA-TSO: # %bb.0: 314; RV32IA-TSO-NEXT: andi a2, a0, -4 315; RV32IA-TSO-NEXT: slli a0, a0, 3 316; RV32IA-TSO-NEXT: li a3, 255 317; RV32IA-TSO-NEXT: andi a1, a1, 255 318; RV32IA-TSO-NEXT: sll a3, a3, a0 319; RV32IA-TSO-NEXT: sll a1, a1, a0 320; RV32IA-TSO-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 321; RV32IA-TSO-NEXT: lr.w a4, (a2) 322; RV32IA-TSO-NEXT: mv a5, a1 323; RV32IA-TSO-NEXT: xor a5, a4, a5 324; RV32IA-TSO-NEXT: and a5, a5, a3 325; RV32IA-TSO-NEXT: xor a5, a4, a5 326; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 327; RV32IA-TSO-NEXT: bnez a5, .LBB2_1 328; RV32IA-TSO-NEXT: # %bb.2: 329; RV32IA-TSO-NEXT: srl a0, a4, a0 330; RV32IA-TSO-NEXT: ret 331; 332; RV64I-LABEL: atomicrmw_xchg_i8_release: 333; RV64I: # %bb.0: 334; RV64I-NEXT: addi sp, sp, -16 335; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 336; RV64I-NEXT: li a2, 3 337; RV64I-NEXT: call __atomic_exchange_1 338; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 339; RV64I-NEXT: addi sp, sp, 16 340; RV64I-NEXT: ret 341; 342; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_release: 343; RV64IA-WMO-NOZACAS: # %bb.0: 344; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 345; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 346; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 347; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 348; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 349; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 350; RV64IA-WMO-NOZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 351; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2) 352; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1 353; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 354; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 355; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 356; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 357; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB2_1 358; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 359; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 360; RV64IA-WMO-NOZACAS-NEXT: ret 361; 362; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_release: 363; RV64IA-TSO-NOZACAS: # %bb.0: 364; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 365; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 366; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 367; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 368; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 369; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 370; RV64IA-TSO-NOZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 371; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 372; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1 373; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 374; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 375; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 376; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 377; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB2_1 378; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 379; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 380; RV64IA-TSO-NOZACAS-NEXT: ret 381; 382; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_release: 383; RV64IA-WMO-ZACAS: # %bb.0: 384; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 385; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 386; RV64IA-WMO-ZACAS-NEXT: li a3, 255 387; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 388; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 389; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 390; RV64IA-WMO-ZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 391; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2) 392; RV64IA-WMO-ZACAS-NEXT: mv a5, a1 393; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 394; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 395; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 396; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 397; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB2_1 398; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 399; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 400; RV64IA-WMO-ZACAS-NEXT: ret 401; 402; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_release: 403; RV64IA-TSO-ZACAS: # %bb.0: 404; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 405; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 406; RV64IA-TSO-ZACAS-NEXT: li a3, 255 407; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 408; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 409; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 410; RV64IA-TSO-ZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 411; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 412; RV64IA-TSO-ZACAS-NEXT: mv a5, a1 413; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 414; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 415; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 416; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 417; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB2_1 418; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 419; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 420; RV64IA-TSO-ZACAS-NEXT: ret 421; 422; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_release: 423; RV64IA-WMO-ZABHA: # %bb.0: 424; RV64IA-WMO-ZABHA-NEXT: amoswap.b.rl a0, a1, (a0) 425; RV64IA-WMO-ZABHA-NEXT: ret 426; 427; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_release: 428; RV64IA-TSO-ZABHA: # %bb.0: 429; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 430; RV64IA-TSO-ZABHA-NEXT: ret 431 %1 = atomicrmw xchg ptr %a, i8 %b release 432 ret i8 %1 433} 434 435define i8 @atomicrmw_xchg_i8_acq_rel(ptr %a, i8 %b) nounwind { 436; RV32I-LABEL: atomicrmw_xchg_i8_acq_rel: 437; RV32I: # %bb.0: 438; RV32I-NEXT: addi sp, sp, -16 439; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 440; RV32I-NEXT: li a2, 4 441; RV32I-NEXT: call __atomic_exchange_1 442; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 443; RV32I-NEXT: addi sp, sp, 16 444; RV32I-NEXT: ret 445; 446; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_acq_rel: 447; RV32IA-WMO: # %bb.0: 448; RV32IA-WMO-NEXT: andi a2, a0, -4 449; RV32IA-WMO-NEXT: slli a0, a0, 3 450; RV32IA-WMO-NEXT: li a3, 255 451; RV32IA-WMO-NEXT: andi a1, a1, 255 452; RV32IA-WMO-NEXT: sll a3, a3, a0 453; RV32IA-WMO-NEXT: sll a1, a1, a0 454; RV32IA-WMO-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 455; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 456; RV32IA-WMO-NEXT: mv a5, a1 457; RV32IA-WMO-NEXT: xor a5, a4, a5 458; RV32IA-WMO-NEXT: and a5, a5, a3 459; RV32IA-WMO-NEXT: xor a5, a4, a5 460; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 461; RV32IA-WMO-NEXT: bnez a5, .LBB3_1 462; RV32IA-WMO-NEXT: # %bb.2: 463; RV32IA-WMO-NEXT: srl a0, a4, a0 464; RV32IA-WMO-NEXT: ret 465; 466; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_acq_rel: 467; RV32IA-TSO: # %bb.0: 468; RV32IA-TSO-NEXT: andi a2, a0, -4 469; RV32IA-TSO-NEXT: slli a0, a0, 3 470; RV32IA-TSO-NEXT: li a3, 255 471; RV32IA-TSO-NEXT: andi a1, a1, 255 472; RV32IA-TSO-NEXT: sll a3, a3, a0 473; RV32IA-TSO-NEXT: sll a1, a1, a0 474; RV32IA-TSO-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 475; RV32IA-TSO-NEXT: lr.w a4, (a2) 476; RV32IA-TSO-NEXT: mv a5, a1 477; RV32IA-TSO-NEXT: xor a5, a4, a5 478; RV32IA-TSO-NEXT: and a5, a5, a3 479; RV32IA-TSO-NEXT: xor a5, a4, a5 480; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 481; RV32IA-TSO-NEXT: bnez a5, .LBB3_1 482; RV32IA-TSO-NEXT: # %bb.2: 483; RV32IA-TSO-NEXT: srl a0, a4, a0 484; RV32IA-TSO-NEXT: ret 485; 486; RV64I-LABEL: atomicrmw_xchg_i8_acq_rel: 487; RV64I: # %bb.0: 488; RV64I-NEXT: addi sp, sp, -16 489; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 490; RV64I-NEXT: li a2, 4 491; RV64I-NEXT: call __atomic_exchange_1 492; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 493; RV64I-NEXT: addi sp, sp, 16 494; RV64I-NEXT: ret 495; 496; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_acq_rel: 497; RV64IA-WMO-NOZACAS: # %bb.0: 498; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 499; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 500; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 501; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 502; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 503; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 504; RV64IA-WMO-NOZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 505; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 506; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1 507; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 508; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 509; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 510; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 511; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB3_1 512; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 513; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 514; RV64IA-WMO-NOZACAS-NEXT: ret 515; 516; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_acq_rel: 517; RV64IA-TSO-NOZACAS: # %bb.0: 518; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 519; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 520; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 521; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 522; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 523; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 524; RV64IA-TSO-NOZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 525; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 526; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1 527; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 528; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 529; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 530; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 531; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB3_1 532; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 533; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 534; RV64IA-TSO-NOZACAS-NEXT: ret 535; 536; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_acq_rel: 537; RV64IA-WMO-ZACAS: # %bb.0: 538; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 539; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 540; RV64IA-WMO-ZACAS-NEXT: li a3, 255 541; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 542; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 543; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 544; RV64IA-WMO-ZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 545; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 546; RV64IA-WMO-ZACAS-NEXT: mv a5, a1 547; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 548; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 549; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 550; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 551; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB3_1 552; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 553; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 554; RV64IA-WMO-ZACAS-NEXT: ret 555; 556; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_acq_rel: 557; RV64IA-TSO-ZACAS: # %bb.0: 558; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 559; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 560; RV64IA-TSO-ZACAS-NEXT: li a3, 255 561; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 562; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 563; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 564; RV64IA-TSO-ZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 565; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 566; RV64IA-TSO-ZACAS-NEXT: mv a5, a1 567; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 568; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 569; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 570; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 571; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB3_1 572; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 573; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 574; RV64IA-TSO-ZACAS-NEXT: ret 575; 576; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_acq_rel: 577; RV64IA-WMO-ZABHA: # %bb.0: 578; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0) 579; RV64IA-WMO-ZABHA-NEXT: ret 580; 581; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_acq_rel: 582; RV64IA-TSO-ZABHA: # %bb.0: 583; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 584; RV64IA-TSO-ZABHA-NEXT: ret 585 %1 = atomicrmw xchg ptr %a, i8 %b acq_rel 586 ret i8 %1 587} 588 589define i8 @atomicrmw_xchg_i8_seq_cst(ptr %a, i8 %b) nounwind { 590; RV32I-LABEL: atomicrmw_xchg_i8_seq_cst: 591; RV32I: # %bb.0: 592; RV32I-NEXT: addi sp, sp, -16 593; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 594; RV32I-NEXT: li a2, 5 595; RV32I-NEXT: call __atomic_exchange_1 596; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 597; RV32I-NEXT: addi sp, sp, 16 598; RV32I-NEXT: ret 599; 600; RV32IA-LABEL: atomicrmw_xchg_i8_seq_cst: 601; RV32IA: # %bb.0: 602; RV32IA-NEXT: andi a2, a0, -4 603; RV32IA-NEXT: slli a0, a0, 3 604; RV32IA-NEXT: li a3, 255 605; RV32IA-NEXT: andi a1, a1, 255 606; RV32IA-NEXT: sll a3, a3, a0 607; RV32IA-NEXT: sll a1, a1, a0 608; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 609; RV32IA-NEXT: lr.w.aqrl a4, (a2) 610; RV32IA-NEXT: mv a5, a1 611; RV32IA-NEXT: xor a5, a4, a5 612; RV32IA-NEXT: and a5, a5, a3 613; RV32IA-NEXT: xor a5, a4, a5 614; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 615; RV32IA-NEXT: bnez a5, .LBB4_1 616; RV32IA-NEXT: # %bb.2: 617; RV32IA-NEXT: srl a0, a4, a0 618; RV32IA-NEXT: ret 619; 620; RV64I-LABEL: atomicrmw_xchg_i8_seq_cst: 621; RV64I: # %bb.0: 622; RV64I-NEXT: addi sp, sp, -16 623; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 624; RV64I-NEXT: li a2, 5 625; RV64I-NEXT: call __atomic_exchange_1 626; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 627; RV64I-NEXT: addi sp, sp, 16 628; RV64I-NEXT: ret 629; 630; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i8_seq_cst: 631; RV64IA-NOZACAS: # %bb.0: 632; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 633; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 634; RV64IA-NOZACAS-NEXT: li a3, 255 635; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 636; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 637; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 638; RV64IA-NOZACAS-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 639; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 640; RV64IA-NOZACAS-NEXT: mv a5, a1 641; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 642; RV64IA-NOZACAS-NEXT: and a5, a5, a3 643; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 644; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 645; RV64IA-NOZACAS-NEXT: bnez a5, .LBB4_1 646; RV64IA-NOZACAS-NEXT: # %bb.2: 647; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 648; RV64IA-NOZACAS-NEXT: ret 649; 650; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i8_seq_cst: 651; RV64IA-ZACAS: # %bb.0: 652; RV64IA-ZACAS-NEXT: andi a2, a0, -4 653; RV64IA-ZACAS-NEXT: slli a0, a0, 3 654; RV64IA-ZACAS-NEXT: li a3, 255 655; RV64IA-ZACAS-NEXT: andi a1, a1, 255 656; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 657; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 658; RV64IA-ZACAS-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 659; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2) 660; RV64IA-ZACAS-NEXT: mv a5, a1 661; RV64IA-ZACAS-NEXT: xor a5, a4, a5 662; RV64IA-ZACAS-NEXT: and a5, a5, a3 663; RV64IA-ZACAS-NEXT: xor a5, a4, a5 664; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 665; RV64IA-ZACAS-NEXT: bnez a5, .LBB4_1 666; RV64IA-ZACAS-NEXT: # %bb.2: 667; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 668; RV64IA-ZACAS-NEXT: ret 669; 670; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_seq_cst: 671; RV64IA-WMO-ZABHA: # %bb.0: 672; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0) 673; RV64IA-WMO-ZABHA-NEXT: ret 674; 675; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_seq_cst: 676; RV64IA-TSO-ZABHA: # %bb.0: 677; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 678; RV64IA-TSO-ZABHA-NEXT: ret 679 %1 = atomicrmw xchg ptr %a, i8 %b seq_cst 680 ret i8 %1 681} 682 683; Ensure the following 'atomicrmw xchg a, {0,-1}` cases are lowered to an 684; amoand or amoor with appropriate mask. 685 686define i8 @atomicrmw_xchg_0_i8_monotonic(ptr %a) nounwind { 687; RV32I-LABEL: atomicrmw_xchg_0_i8_monotonic: 688; RV32I: # %bb.0: 689; RV32I-NEXT: addi sp, sp, -16 690; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 691; RV32I-NEXT: li a1, 0 692; RV32I-NEXT: li a2, 0 693; RV32I-NEXT: call __atomic_exchange_1 694; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 695; RV32I-NEXT: addi sp, sp, 16 696; RV32I-NEXT: ret 697; 698; RV32IA-LABEL: atomicrmw_xchg_0_i8_monotonic: 699; RV32IA: # %bb.0: 700; RV32IA-NEXT: andi a1, a0, -4 701; RV32IA-NEXT: slli a0, a0, 3 702; RV32IA-NEXT: li a2, 255 703; RV32IA-NEXT: sll a2, a2, a0 704; RV32IA-NEXT: not a2, a2 705; RV32IA-NEXT: amoand.w a1, a2, (a1) 706; RV32IA-NEXT: srl a0, a1, a0 707; RV32IA-NEXT: ret 708; 709; RV64I-LABEL: atomicrmw_xchg_0_i8_monotonic: 710; RV64I: # %bb.0: 711; RV64I-NEXT: addi sp, sp, -16 712; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 713; RV64I-NEXT: li a1, 0 714; RV64I-NEXT: li a2, 0 715; RV64I-NEXT: call __atomic_exchange_1 716; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 717; RV64I-NEXT: addi sp, sp, 16 718; RV64I-NEXT: ret 719; 720; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_0_i8_monotonic: 721; RV64IA-NOZACAS: # %bb.0: 722; RV64IA-NOZACAS-NEXT: andi a1, a0, -4 723; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 724; RV64IA-NOZACAS-NEXT: li a2, 255 725; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0 726; RV64IA-NOZACAS-NEXT: not a2, a2 727; RV64IA-NOZACAS-NEXT: amoand.w a1, a2, (a1) 728; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 729; RV64IA-NOZACAS-NEXT: ret 730; 731; RV64IA-ZACAS-LABEL: atomicrmw_xchg_0_i8_monotonic: 732; RV64IA-ZACAS: # %bb.0: 733; RV64IA-ZACAS-NEXT: andi a1, a0, -4 734; RV64IA-ZACAS-NEXT: slli a0, a0, 3 735; RV64IA-ZACAS-NEXT: li a2, 255 736; RV64IA-ZACAS-NEXT: sllw a2, a2, a0 737; RV64IA-ZACAS-NEXT: not a2, a2 738; RV64IA-ZACAS-NEXT: amoand.w a1, a2, (a1) 739; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 740; RV64IA-ZACAS-NEXT: ret 741; 742; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_monotonic: 743; RV64IA-WMO-ZABHA: # %bb.0: 744; RV64IA-WMO-ZABHA-NEXT: amoswap.b a0, zero, (a0) 745; RV64IA-WMO-ZABHA-NEXT: ret 746; 747; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_monotonic: 748; RV64IA-TSO-ZABHA: # %bb.0: 749; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0) 750; RV64IA-TSO-ZABHA-NEXT: ret 751 %1 = atomicrmw xchg ptr %a, i8 0 monotonic 752 ret i8 %1 753} 754 755define i8 @atomicrmw_xchg_0_i8_acquire(ptr %a) nounwind { 756; RV32I-LABEL: atomicrmw_xchg_0_i8_acquire: 757; RV32I: # %bb.0: 758; RV32I-NEXT: addi sp, sp, -16 759; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 760; RV32I-NEXT: li a2, 2 761; RV32I-NEXT: li a1, 0 762; RV32I-NEXT: call __atomic_exchange_1 763; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 764; RV32I-NEXT: addi sp, sp, 16 765; RV32I-NEXT: ret 766; 767; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_acquire: 768; RV32IA-WMO: # %bb.0: 769; RV32IA-WMO-NEXT: andi a1, a0, -4 770; RV32IA-WMO-NEXT: slli a0, a0, 3 771; RV32IA-WMO-NEXT: li a2, 255 772; RV32IA-WMO-NEXT: sll a2, a2, a0 773; RV32IA-WMO-NEXT: not a2, a2 774; RV32IA-WMO-NEXT: amoand.w.aq a1, a2, (a1) 775; RV32IA-WMO-NEXT: srl a0, a1, a0 776; RV32IA-WMO-NEXT: ret 777; 778; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_acquire: 779; RV32IA-TSO: # %bb.0: 780; RV32IA-TSO-NEXT: andi a1, a0, -4 781; RV32IA-TSO-NEXT: slli a0, a0, 3 782; RV32IA-TSO-NEXT: li a2, 255 783; RV32IA-TSO-NEXT: sll a2, a2, a0 784; RV32IA-TSO-NEXT: not a2, a2 785; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 786; RV32IA-TSO-NEXT: srl a0, a1, a0 787; RV32IA-TSO-NEXT: ret 788; 789; RV64I-LABEL: atomicrmw_xchg_0_i8_acquire: 790; RV64I: # %bb.0: 791; RV64I-NEXT: addi sp, sp, -16 792; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 793; RV64I-NEXT: li a2, 2 794; RV64I-NEXT: li a1, 0 795; RV64I-NEXT: call __atomic_exchange_1 796; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 797; RV64I-NEXT: addi sp, sp, 16 798; RV64I-NEXT: ret 799; 800; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acquire: 801; RV64IA-WMO-NOZACAS: # %bb.0: 802; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 803; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 804; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 805; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 806; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 807; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a2, (a1) 808; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 809; RV64IA-WMO-NOZACAS-NEXT: ret 810; 811; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acquire: 812; RV64IA-TSO-NOZACAS: # %bb.0: 813; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 814; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 815; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 816; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 817; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 818; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 819; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 820; RV64IA-TSO-NOZACAS-NEXT: ret 821; 822; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acquire: 823; RV64IA-WMO-ZACAS: # %bb.0: 824; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 825; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 826; RV64IA-WMO-ZACAS-NEXT: li a2, 255 827; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 828; RV64IA-WMO-ZACAS-NEXT: not a2, a2 829; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a2, (a1) 830; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 831; RV64IA-WMO-ZACAS-NEXT: ret 832; 833; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acquire: 834; RV64IA-TSO-ZACAS: # %bb.0: 835; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 836; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 837; RV64IA-TSO-ZACAS-NEXT: li a2, 255 838; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 839; RV64IA-TSO-ZACAS-NEXT: not a2, a2 840; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 841; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 842; RV64IA-TSO-ZACAS-NEXT: ret 843; 844; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acquire: 845; RV64IA-WMO-ZABHA: # %bb.0: 846; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aq a0, zero, (a0) 847; RV64IA-WMO-ZABHA-NEXT: ret 848; 849; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acquire: 850; RV64IA-TSO-ZABHA: # %bb.0: 851; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0) 852; RV64IA-TSO-ZABHA-NEXT: ret 853 %1 = atomicrmw xchg ptr %a, i8 0 acquire 854 ret i8 %1 855} 856 857define i8 @atomicrmw_xchg_0_i8_release(ptr %a) nounwind { 858; RV32I-LABEL: atomicrmw_xchg_0_i8_release: 859; RV32I: # %bb.0: 860; RV32I-NEXT: addi sp, sp, -16 861; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 862; RV32I-NEXT: li a2, 3 863; RV32I-NEXT: li a1, 0 864; RV32I-NEXT: call __atomic_exchange_1 865; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 866; RV32I-NEXT: addi sp, sp, 16 867; RV32I-NEXT: ret 868; 869; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_release: 870; RV32IA-WMO: # %bb.0: 871; RV32IA-WMO-NEXT: andi a1, a0, -4 872; RV32IA-WMO-NEXT: slli a0, a0, 3 873; RV32IA-WMO-NEXT: li a2, 255 874; RV32IA-WMO-NEXT: sll a2, a2, a0 875; RV32IA-WMO-NEXT: not a2, a2 876; RV32IA-WMO-NEXT: amoand.w.rl a1, a2, (a1) 877; RV32IA-WMO-NEXT: srl a0, a1, a0 878; RV32IA-WMO-NEXT: ret 879; 880; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_release: 881; RV32IA-TSO: # %bb.0: 882; RV32IA-TSO-NEXT: andi a1, a0, -4 883; RV32IA-TSO-NEXT: slli a0, a0, 3 884; RV32IA-TSO-NEXT: li a2, 255 885; RV32IA-TSO-NEXT: sll a2, a2, a0 886; RV32IA-TSO-NEXT: not a2, a2 887; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 888; RV32IA-TSO-NEXT: srl a0, a1, a0 889; RV32IA-TSO-NEXT: ret 890; 891; RV64I-LABEL: atomicrmw_xchg_0_i8_release: 892; RV64I: # %bb.0: 893; RV64I-NEXT: addi sp, sp, -16 894; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 895; RV64I-NEXT: li a2, 3 896; RV64I-NEXT: li a1, 0 897; RV64I-NEXT: call __atomic_exchange_1 898; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 899; RV64I-NEXT: addi sp, sp, 16 900; RV64I-NEXT: ret 901; 902; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_release: 903; RV64IA-WMO-NOZACAS: # %bb.0: 904; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 905; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 906; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 907; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 908; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 909; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a2, (a1) 910; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 911; RV64IA-WMO-NOZACAS-NEXT: ret 912; 913; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_release: 914; RV64IA-TSO-NOZACAS: # %bb.0: 915; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 916; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 917; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 918; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 919; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 920; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 921; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 922; RV64IA-TSO-NOZACAS-NEXT: ret 923; 924; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_release: 925; RV64IA-WMO-ZACAS: # %bb.0: 926; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 927; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 928; RV64IA-WMO-ZACAS-NEXT: li a2, 255 929; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 930; RV64IA-WMO-ZACAS-NEXT: not a2, a2 931; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a2, (a1) 932; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 933; RV64IA-WMO-ZACAS-NEXT: ret 934; 935; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_release: 936; RV64IA-TSO-ZACAS: # %bb.0: 937; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 938; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 939; RV64IA-TSO-ZACAS-NEXT: li a2, 255 940; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 941; RV64IA-TSO-ZACAS-NEXT: not a2, a2 942; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 943; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 944; RV64IA-TSO-ZACAS-NEXT: ret 945; 946; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_release: 947; RV64IA-WMO-ZABHA: # %bb.0: 948; RV64IA-WMO-ZABHA-NEXT: amoswap.b.rl a0, zero, (a0) 949; RV64IA-WMO-ZABHA-NEXT: ret 950; 951; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_release: 952; RV64IA-TSO-ZABHA: # %bb.0: 953; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0) 954; RV64IA-TSO-ZABHA-NEXT: ret 955 %1 = atomicrmw xchg ptr %a, i8 0 release 956 ret i8 %1 957} 958 959define i8 @atomicrmw_xchg_0_i8_acq_rel(ptr %a) nounwind { 960; RV32I-LABEL: atomicrmw_xchg_0_i8_acq_rel: 961; RV32I: # %bb.0: 962; RV32I-NEXT: addi sp, sp, -16 963; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 964; RV32I-NEXT: li a2, 4 965; RV32I-NEXT: li a1, 0 966; RV32I-NEXT: call __atomic_exchange_1 967; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 968; RV32I-NEXT: addi sp, sp, 16 969; RV32I-NEXT: ret 970; 971; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_acq_rel: 972; RV32IA-WMO: # %bb.0: 973; RV32IA-WMO-NEXT: andi a1, a0, -4 974; RV32IA-WMO-NEXT: slli a0, a0, 3 975; RV32IA-WMO-NEXT: li a2, 255 976; RV32IA-WMO-NEXT: sll a2, a2, a0 977; RV32IA-WMO-NEXT: not a2, a2 978; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1) 979; RV32IA-WMO-NEXT: srl a0, a1, a0 980; RV32IA-WMO-NEXT: ret 981; 982; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_acq_rel: 983; RV32IA-TSO: # %bb.0: 984; RV32IA-TSO-NEXT: andi a1, a0, -4 985; RV32IA-TSO-NEXT: slli a0, a0, 3 986; RV32IA-TSO-NEXT: li a2, 255 987; RV32IA-TSO-NEXT: sll a2, a2, a0 988; RV32IA-TSO-NEXT: not a2, a2 989; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 990; RV32IA-TSO-NEXT: srl a0, a1, a0 991; RV32IA-TSO-NEXT: ret 992; 993; RV64I-LABEL: atomicrmw_xchg_0_i8_acq_rel: 994; RV64I: # %bb.0: 995; RV64I-NEXT: addi sp, sp, -16 996; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 997; RV64I-NEXT: li a2, 4 998; RV64I-NEXT: li a1, 0 999; RV64I-NEXT: call __atomic_exchange_1 1000; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1001; RV64I-NEXT: addi sp, sp, 16 1002; RV64I-NEXT: ret 1003; 1004; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel: 1005; RV64IA-WMO-NOZACAS: # %bb.0: 1006; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 1007; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1008; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 1009; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 1010; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 1011; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 1012; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 1013; RV64IA-WMO-NOZACAS-NEXT: ret 1014; 1015; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel: 1016; RV64IA-TSO-NOZACAS: # %bb.0: 1017; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 1018; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1019; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 1020; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 1021; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 1022; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 1023; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 1024; RV64IA-TSO-NOZACAS-NEXT: ret 1025; 1026; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel: 1027; RV64IA-WMO-ZACAS: # %bb.0: 1028; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 1029; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1030; RV64IA-WMO-ZACAS-NEXT: li a2, 255 1031; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 1032; RV64IA-WMO-ZACAS-NEXT: not a2, a2 1033; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 1034; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 1035; RV64IA-WMO-ZACAS-NEXT: ret 1036; 1037; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel: 1038; RV64IA-TSO-ZACAS: # %bb.0: 1039; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 1040; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1041; RV64IA-TSO-ZACAS-NEXT: li a2, 255 1042; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 1043; RV64IA-TSO-ZACAS-NEXT: not a2, a2 1044; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 1045; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 1046; RV64IA-TSO-ZACAS-NEXT: ret 1047; 1048; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acq_rel: 1049; RV64IA-WMO-ZABHA: # %bb.0: 1050; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, zero, (a0) 1051; RV64IA-WMO-ZABHA-NEXT: ret 1052; 1053; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acq_rel: 1054; RV64IA-TSO-ZABHA: # %bb.0: 1055; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0) 1056; RV64IA-TSO-ZABHA-NEXT: ret 1057 %1 = atomicrmw xchg ptr %a, i8 0 acq_rel 1058 ret i8 %1 1059} 1060 1061define i8 @atomicrmw_xchg_0_i8_seq_cst(ptr %a) nounwind { 1062; RV32I-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1063; RV32I: # %bb.0: 1064; RV32I-NEXT: addi sp, sp, -16 1065; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1066; RV32I-NEXT: li a2, 5 1067; RV32I-NEXT: li a1, 0 1068; RV32I-NEXT: call __atomic_exchange_1 1069; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1070; RV32I-NEXT: addi sp, sp, 16 1071; RV32I-NEXT: ret 1072; 1073; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1074; RV32IA-WMO: # %bb.0: 1075; RV32IA-WMO-NEXT: andi a1, a0, -4 1076; RV32IA-WMO-NEXT: slli a0, a0, 3 1077; RV32IA-WMO-NEXT: li a2, 255 1078; RV32IA-WMO-NEXT: sll a2, a2, a0 1079; RV32IA-WMO-NEXT: not a2, a2 1080; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1) 1081; RV32IA-WMO-NEXT: srl a0, a1, a0 1082; RV32IA-WMO-NEXT: ret 1083; 1084; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1085; RV32IA-TSO: # %bb.0: 1086; RV32IA-TSO-NEXT: andi a1, a0, -4 1087; RV32IA-TSO-NEXT: slli a0, a0, 3 1088; RV32IA-TSO-NEXT: li a2, 255 1089; RV32IA-TSO-NEXT: sll a2, a2, a0 1090; RV32IA-TSO-NEXT: not a2, a2 1091; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 1092; RV32IA-TSO-NEXT: srl a0, a1, a0 1093; RV32IA-TSO-NEXT: ret 1094; 1095; RV64I-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1096; RV64I: # %bb.0: 1097; RV64I-NEXT: addi sp, sp, -16 1098; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1099; RV64I-NEXT: li a2, 5 1100; RV64I-NEXT: li a1, 0 1101; RV64I-NEXT: call __atomic_exchange_1 1102; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1103; RV64I-NEXT: addi sp, sp, 16 1104; RV64I-NEXT: ret 1105; 1106; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1107; RV64IA-WMO-NOZACAS: # %bb.0: 1108; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 1109; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1110; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 1111; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 1112; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 1113; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 1114; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 1115; RV64IA-WMO-NOZACAS-NEXT: ret 1116; 1117; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1118; RV64IA-TSO-NOZACAS: # %bb.0: 1119; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 1120; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1121; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 1122; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 1123; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 1124; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 1125; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 1126; RV64IA-TSO-NOZACAS-NEXT: ret 1127; 1128; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1129; RV64IA-WMO-ZACAS: # %bb.0: 1130; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 1131; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1132; RV64IA-WMO-ZACAS-NEXT: li a2, 255 1133; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 1134; RV64IA-WMO-ZACAS-NEXT: not a2, a2 1135; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 1136; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 1137; RV64IA-WMO-ZACAS-NEXT: ret 1138; 1139; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1140; RV64IA-TSO-ZACAS: # %bb.0: 1141; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 1142; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1143; RV64IA-TSO-ZACAS-NEXT: li a2, 255 1144; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 1145; RV64IA-TSO-ZACAS-NEXT: not a2, a2 1146; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 1147; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 1148; RV64IA-TSO-ZACAS-NEXT: ret 1149; 1150; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1151; RV64IA-WMO-ZABHA: # %bb.0: 1152; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, zero, (a0) 1153; RV64IA-WMO-ZABHA-NEXT: ret 1154; 1155; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_seq_cst: 1156; RV64IA-TSO-ZABHA: # %bb.0: 1157; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0) 1158; RV64IA-TSO-ZABHA-NEXT: ret 1159 %1 = atomicrmw xchg ptr %a, i8 0 seq_cst 1160 ret i8 %1 1161} 1162 1163define i8 @atomicrmw_xchg_minus_1_i8_monotonic(ptr %a) nounwind { 1164; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1165; RV32I: # %bb.0: 1166; RV32I-NEXT: addi sp, sp, -16 1167; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1168; RV32I-NEXT: li a1, 255 1169; RV32I-NEXT: li a2, 0 1170; RV32I-NEXT: call __atomic_exchange_1 1171; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1172; RV32I-NEXT: addi sp, sp, 16 1173; RV32I-NEXT: ret 1174; 1175; RV32IA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1176; RV32IA: # %bb.0: 1177; RV32IA-NEXT: andi a1, a0, -4 1178; RV32IA-NEXT: slli a0, a0, 3 1179; RV32IA-NEXT: li a2, 255 1180; RV32IA-NEXT: sll a2, a2, a0 1181; RV32IA-NEXT: amoor.w a1, a2, (a1) 1182; RV32IA-NEXT: srl a0, a1, a0 1183; RV32IA-NEXT: ret 1184; 1185; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1186; RV64I: # %bb.0: 1187; RV64I-NEXT: addi sp, sp, -16 1188; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1189; RV64I-NEXT: li a1, 255 1190; RV64I-NEXT: li a2, 0 1191; RV64I-NEXT: call __atomic_exchange_1 1192; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1193; RV64I-NEXT: addi sp, sp, 16 1194; RV64I-NEXT: ret 1195; 1196; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1197; RV64IA-NOZACAS: # %bb.0: 1198; RV64IA-NOZACAS-NEXT: andi a1, a0, -4 1199; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 1200; RV64IA-NOZACAS-NEXT: li a2, 255 1201; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0 1202; RV64IA-NOZACAS-NEXT: amoor.w a1, a2, (a1) 1203; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 1204; RV64IA-NOZACAS-NEXT: ret 1205; 1206; RV64IA-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1207; RV64IA-ZACAS: # %bb.0: 1208; RV64IA-ZACAS-NEXT: andi a1, a0, -4 1209; RV64IA-ZACAS-NEXT: slli a0, a0, 3 1210; RV64IA-ZACAS-NEXT: li a2, 255 1211; RV64IA-ZACAS-NEXT: sllw a2, a2, a0 1212; RV64IA-ZACAS-NEXT: amoor.w a1, a2, (a1) 1213; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 1214; RV64IA-ZACAS-NEXT: ret 1215; 1216; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1217; RV64IA-WMO-ZABHA: # %bb.0: 1218; RV64IA-WMO-ZABHA-NEXT: li a1, -1 1219; RV64IA-WMO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 1220; RV64IA-WMO-ZABHA-NEXT: ret 1221; 1222; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic: 1223; RV64IA-TSO-ZABHA: # %bb.0: 1224; RV64IA-TSO-ZABHA-NEXT: li a1, -1 1225; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 1226; RV64IA-TSO-ZABHA-NEXT: ret 1227 %1 = atomicrmw xchg ptr %a, i8 -1 monotonic 1228 ret i8 %1 1229} 1230 1231define i8 @atomicrmw_xchg_minus_1_i8_acquire(ptr %a) nounwind { 1232; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1233; RV32I: # %bb.0: 1234; RV32I-NEXT: addi sp, sp, -16 1235; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1236; RV32I-NEXT: li a1, 255 1237; RV32I-NEXT: li a2, 2 1238; RV32I-NEXT: call __atomic_exchange_1 1239; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1240; RV32I-NEXT: addi sp, sp, 16 1241; RV32I-NEXT: ret 1242; 1243; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1244; RV32IA-WMO: # %bb.0: 1245; RV32IA-WMO-NEXT: andi a1, a0, -4 1246; RV32IA-WMO-NEXT: slli a0, a0, 3 1247; RV32IA-WMO-NEXT: li a2, 255 1248; RV32IA-WMO-NEXT: sll a2, a2, a0 1249; RV32IA-WMO-NEXT: amoor.w.aq a1, a2, (a1) 1250; RV32IA-WMO-NEXT: srl a0, a1, a0 1251; RV32IA-WMO-NEXT: ret 1252; 1253; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1254; RV32IA-TSO: # %bb.0: 1255; RV32IA-TSO-NEXT: andi a1, a0, -4 1256; RV32IA-TSO-NEXT: slli a0, a0, 3 1257; RV32IA-TSO-NEXT: li a2, 255 1258; RV32IA-TSO-NEXT: sll a2, a2, a0 1259; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 1260; RV32IA-TSO-NEXT: srl a0, a1, a0 1261; RV32IA-TSO-NEXT: ret 1262; 1263; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1264; RV64I: # %bb.0: 1265; RV64I-NEXT: addi sp, sp, -16 1266; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1267; RV64I-NEXT: li a1, 255 1268; RV64I-NEXT: li a2, 2 1269; RV64I-NEXT: call __atomic_exchange_1 1270; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1271; RV64I-NEXT: addi sp, sp, 16 1272; RV64I-NEXT: ret 1273; 1274; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1275; RV64IA-WMO-NOZACAS: # %bb.0: 1276; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 1277; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1278; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 1279; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 1280; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a2, (a1) 1281; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 1282; RV64IA-WMO-NOZACAS-NEXT: ret 1283; 1284; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1285; RV64IA-TSO-NOZACAS: # %bb.0: 1286; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 1287; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1288; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 1289; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 1290; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 1291; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 1292; RV64IA-TSO-NOZACAS-NEXT: ret 1293; 1294; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1295; RV64IA-WMO-ZACAS: # %bb.0: 1296; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 1297; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1298; RV64IA-WMO-ZACAS-NEXT: li a2, 255 1299; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 1300; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a2, (a1) 1301; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 1302; RV64IA-WMO-ZACAS-NEXT: ret 1303; 1304; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1305; RV64IA-TSO-ZACAS: # %bb.0: 1306; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 1307; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1308; RV64IA-TSO-ZACAS-NEXT: li a2, 255 1309; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 1310; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 1311; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 1312; RV64IA-TSO-ZACAS-NEXT: ret 1313; 1314; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1315; RV64IA-WMO-ZABHA: # %bb.0: 1316; RV64IA-WMO-ZABHA-NEXT: li a1, -1 1317; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aq a0, a1, (a0) 1318; RV64IA-WMO-ZABHA-NEXT: ret 1319; 1320; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acquire: 1321; RV64IA-TSO-ZABHA: # %bb.0: 1322; RV64IA-TSO-ZABHA-NEXT: li a1, -1 1323; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 1324; RV64IA-TSO-ZABHA-NEXT: ret 1325 %1 = atomicrmw xchg ptr %a, i8 -1 acquire 1326 ret i8 %1 1327} 1328 1329define i8 @atomicrmw_xchg_minus_1_i8_release(ptr %a) nounwind { 1330; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_release: 1331; RV32I: # %bb.0: 1332; RV32I-NEXT: addi sp, sp, -16 1333; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1334; RV32I-NEXT: li a1, 255 1335; RV32I-NEXT: li a2, 3 1336; RV32I-NEXT: call __atomic_exchange_1 1337; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1338; RV32I-NEXT: addi sp, sp, 16 1339; RV32I-NEXT: ret 1340; 1341; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_release: 1342; RV32IA-WMO: # %bb.0: 1343; RV32IA-WMO-NEXT: andi a1, a0, -4 1344; RV32IA-WMO-NEXT: slli a0, a0, 3 1345; RV32IA-WMO-NEXT: li a2, 255 1346; RV32IA-WMO-NEXT: sll a2, a2, a0 1347; RV32IA-WMO-NEXT: amoor.w.rl a1, a2, (a1) 1348; RV32IA-WMO-NEXT: srl a0, a1, a0 1349; RV32IA-WMO-NEXT: ret 1350; 1351; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_release: 1352; RV32IA-TSO: # %bb.0: 1353; RV32IA-TSO-NEXT: andi a1, a0, -4 1354; RV32IA-TSO-NEXT: slli a0, a0, 3 1355; RV32IA-TSO-NEXT: li a2, 255 1356; RV32IA-TSO-NEXT: sll a2, a2, a0 1357; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 1358; RV32IA-TSO-NEXT: srl a0, a1, a0 1359; RV32IA-TSO-NEXT: ret 1360; 1361; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_release: 1362; RV64I: # %bb.0: 1363; RV64I-NEXT: addi sp, sp, -16 1364; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1365; RV64I-NEXT: li a1, 255 1366; RV64I-NEXT: li a2, 3 1367; RV64I-NEXT: call __atomic_exchange_1 1368; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1369; RV64I-NEXT: addi sp, sp, 16 1370; RV64I-NEXT: ret 1371; 1372; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release: 1373; RV64IA-WMO-NOZACAS: # %bb.0: 1374; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 1375; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1376; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 1377; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 1378; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a2, (a1) 1379; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 1380; RV64IA-WMO-NOZACAS-NEXT: ret 1381; 1382; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release: 1383; RV64IA-TSO-NOZACAS: # %bb.0: 1384; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 1385; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1386; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 1387; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 1388; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 1389; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 1390; RV64IA-TSO-NOZACAS-NEXT: ret 1391; 1392; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release: 1393; RV64IA-WMO-ZACAS: # %bb.0: 1394; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 1395; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1396; RV64IA-WMO-ZACAS-NEXT: li a2, 255 1397; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 1398; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a2, (a1) 1399; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 1400; RV64IA-WMO-ZACAS-NEXT: ret 1401; 1402; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release: 1403; RV64IA-TSO-ZACAS: # %bb.0: 1404; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 1405; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1406; RV64IA-TSO-ZACAS-NEXT: li a2, 255 1407; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 1408; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 1409; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 1410; RV64IA-TSO-ZACAS-NEXT: ret 1411; 1412; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_release: 1413; RV64IA-WMO-ZABHA: # %bb.0: 1414; RV64IA-WMO-ZABHA-NEXT: li a1, -1 1415; RV64IA-WMO-ZABHA-NEXT: amoswap.b.rl a0, a1, (a0) 1416; RV64IA-WMO-ZABHA-NEXT: ret 1417; 1418; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_release: 1419; RV64IA-TSO-ZABHA: # %bb.0: 1420; RV64IA-TSO-ZABHA-NEXT: li a1, -1 1421; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 1422; RV64IA-TSO-ZABHA-NEXT: ret 1423 %1 = atomicrmw xchg ptr %a, i8 -1 release 1424 ret i8 %1 1425} 1426 1427define i8 @atomicrmw_xchg_minus_1_i8_acq_rel(ptr %a) nounwind { 1428; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1429; RV32I: # %bb.0: 1430; RV32I-NEXT: addi sp, sp, -16 1431; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1432; RV32I-NEXT: li a1, 255 1433; RV32I-NEXT: li a2, 4 1434; RV32I-NEXT: call __atomic_exchange_1 1435; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1436; RV32I-NEXT: addi sp, sp, 16 1437; RV32I-NEXT: ret 1438; 1439; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1440; RV32IA-WMO: # %bb.0: 1441; RV32IA-WMO-NEXT: andi a1, a0, -4 1442; RV32IA-WMO-NEXT: slli a0, a0, 3 1443; RV32IA-WMO-NEXT: li a2, 255 1444; RV32IA-WMO-NEXT: sll a2, a2, a0 1445; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1) 1446; RV32IA-WMO-NEXT: srl a0, a1, a0 1447; RV32IA-WMO-NEXT: ret 1448; 1449; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1450; RV32IA-TSO: # %bb.0: 1451; RV32IA-TSO-NEXT: andi a1, a0, -4 1452; RV32IA-TSO-NEXT: slli a0, a0, 3 1453; RV32IA-TSO-NEXT: li a2, 255 1454; RV32IA-TSO-NEXT: sll a2, a2, a0 1455; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 1456; RV32IA-TSO-NEXT: srl a0, a1, a0 1457; RV32IA-TSO-NEXT: ret 1458; 1459; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1460; RV64I: # %bb.0: 1461; RV64I-NEXT: addi sp, sp, -16 1462; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1463; RV64I-NEXT: li a1, 255 1464; RV64I-NEXT: li a2, 4 1465; RV64I-NEXT: call __atomic_exchange_1 1466; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1467; RV64I-NEXT: addi sp, sp, 16 1468; RV64I-NEXT: ret 1469; 1470; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1471; RV64IA-WMO-NOZACAS: # %bb.0: 1472; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 1473; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1474; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 1475; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 1476; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 1477; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 1478; RV64IA-WMO-NOZACAS-NEXT: ret 1479; 1480; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1481; RV64IA-TSO-NOZACAS: # %bb.0: 1482; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 1483; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1484; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 1485; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 1486; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 1487; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 1488; RV64IA-TSO-NOZACAS-NEXT: ret 1489; 1490; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1491; RV64IA-WMO-ZACAS: # %bb.0: 1492; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 1493; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1494; RV64IA-WMO-ZACAS-NEXT: li a2, 255 1495; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 1496; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 1497; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 1498; RV64IA-WMO-ZACAS-NEXT: ret 1499; 1500; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1501; RV64IA-TSO-ZACAS: # %bb.0: 1502; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 1503; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1504; RV64IA-TSO-ZACAS-NEXT: li a2, 255 1505; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 1506; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 1507; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 1508; RV64IA-TSO-ZACAS-NEXT: ret 1509; 1510; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1511; RV64IA-WMO-ZABHA: # %bb.0: 1512; RV64IA-WMO-ZABHA-NEXT: li a1, -1 1513; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0) 1514; RV64IA-WMO-ZABHA-NEXT: ret 1515; 1516; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel: 1517; RV64IA-TSO-ZABHA: # %bb.0: 1518; RV64IA-TSO-ZABHA-NEXT: li a1, -1 1519; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 1520; RV64IA-TSO-ZABHA-NEXT: ret 1521 %1 = atomicrmw xchg ptr %a, i8 -1 acq_rel 1522 ret i8 %1 1523} 1524 1525define i8 @atomicrmw_xchg_minus_1_i8_seq_cst(ptr %a) nounwind { 1526; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1527; RV32I: # %bb.0: 1528; RV32I-NEXT: addi sp, sp, -16 1529; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1530; RV32I-NEXT: li a1, 255 1531; RV32I-NEXT: li a2, 5 1532; RV32I-NEXT: call __atomic_exchange_1 1533; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1534; RV32I-NEXT: addi sp, sp, 16 1535; RV32I-NEXT: ret 1536; 1537; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1538; RV32IA-WMO: # %bb.0: 1539; RV32IA-WMO-NEXT: andi a1, a0, -4 1540; RV32IA-WMO-NEXT: slli a0, a0, 3 1541; RV32IA-WMO-NEXT: li a2, 255 1542; RV32IA-WMO-NEXT: sll a2, a2, a0 1543; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1) 1544; RV32IA-WMO-NEXT: srl a0, a1, a0 1545; RV32IA-WMO-NEXT: ret 1546; 1547; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1548; RV32IA-TSO: # %bb.0: 1549; RV32IA-TSO-NEXT: andi a1, a0, -4 1550; RV32IA-TSO-NEXT: slli a0, a0, 3 1551; RV32IA-TSO-NEXT: li a2, 255 1552; RV32IA-TSO-NEXT: sll a2, a2, a0 1553; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 1554; RV32IA-TSO-NEXT: srl a0, a1, a0 1555; RV32IA-TSO-NEXT: ret 1556; 1557; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1558; RV64I: # %bb.0: 1559; RV64I-NEXT: addi sp, sp, -16 1560; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1561; RV64I-NEXT: li a1, 255 1562; RV64I-NEXT: li a2, 5 1563; RV64I-NEXT: call __atomic_exchange_1 1564; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1565; RV64I-NEXT: addi sp, sp, 16 1566; RV64I-NEXT: ret 1567; 1568; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1569; RV64IA-WMO-NOZACAS: # %bb.0: 1570; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 1571; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1572; RV64IA-WMO-NOZACAS-NEXT: li a2, 255 1573; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 1574; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 1575; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 1576; RV64IA-WMO-NOZACAS-NEXT: ret 1577; 1578; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1579; RV64IA-TSO-NOZACAS: # %bb.0: 1580; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 1581; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1582; RV64IA-TSO-NOZACAS-NEXT: li a2, 255 1583; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 1584; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 1585; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 1586; RV64IA-TSO-NOZACAS-NEXT: ret 1587; 1588; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1589; RV64IA-WMO-ZACAS: # %bb.0: 1590; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 1591; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1592; RV64IA-WMO-ZACAS-NEXT: li a2, 255 1593; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 1594; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 1595; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 1596; RV64IA-WMO-ZACAS-NEXT: ret 1597; 1598; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1599; RV64IA-TSO-ZACAS: # %bb.0: 1600; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 1601; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1602; RV64IA-TSO-ZACAS-NEXT: li a2, 255 1603; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 1604; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 1605; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 1606; RV64IA-TSO-ZACAS-NEXT: ret 1607; 1608; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1609; RV64IA-WMO-ZABHA: # %bb.0: 1610; RV64IA-WMO-ZABHA-NEXT: li a1, -1 1611; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0) 1612; RV64IA-WMO-ZABHA-NEXT: ret 1613; 1614; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst: 1615; RV64IA-TSO-ZABHA: # %bb.0: 1616; RV64IA-TSO-ZABHA-NEXT: li a1, -1 1617; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0) 1618; RV64IA-TSO-ZABHA-NEXT: ret 1619 %1 = atomicrmw xchg ptr %a, i8 -1 seq_cst 1620 ret i8 %1 1621} 1622 1623define i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind { 1624; RV32I-LABEL: atomicrmw_add_i8_monotonic: 1625; RV32I: # %bb.0: 1626; RV32I-NEXT: addi sp, sp, -16 1627; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1628; RV32I-NEXT: li a2, 0 1629; RV32I-NEXT: call __atomic_fetch_add_1 1630; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1631; RV32I-NEXT: addi sp, sp, 16 1632; RV32I-NEXT: ret 1633; 1634; RV32IA-LABEL: atomicrmw_add_i8_monotonic: 1635; RV32IA: # %bb.0: 1636; RV32IA-NEXT: andi a2, a0, -4 1637; RV32IA-NEXT: slli a0, a0, 3 1638; RV32IA-NEXT: li a3, 255 1639; RV32IA-NEXT: andi a1, a1, 255 1640; RV32IA-NEXT: sll a3, a3, a0 1641; RV32IA-NEXT: sll a1, a1, a0 1642; RV32IA-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1643; RV32IA-NEXT: lr.w a4, (a2) 1644; RV32IA-NEXT: add a5, a4, a1 1645; RV32IA-NEXT: xor a5, a4, a5 1646; RV32IA-NEXT: and a5, a5, a3 1647; RV32IA-NEXT: xor a5, a4, a5 1648; RV32IA-NEXT: sc.w a5, a5, (a2) 1649; RV32IA-NEXT: bnez a5, .LBB15_1 1650; RV32IA-NEXT: # %bb.2: 1651; RV32IA-NEXT: srl a0, a4, a0 1652; RV32IA-NEXT: ret 1653; 1654; RV64I-LABEL: atomicrmw_add_i8_monotonic: 1655; RV64I: # %bb.0: 1656; RV64I-NEXT: addi sp, sp, -16 1657; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1658; RV64I-NEXT: li a2, 0 1659; RV64I-NEXT: call __atomic_fetch_add_1 1660; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1661; RV64I-NEXT: addi sp, sp, 16 1662; RV64I-NEXT: ret 1663; 1664; RV64IA-NOZACAS-LABEL: atomicrmw_add_i8_monotonic: 1665; RV64IA-NOZACAS: # %bb.0: 1666; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 1667; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 1668; RV64IA-NOZACAS-NEXT: li a3, 255 1669; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 1670; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 1671; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 1672; RV64IA-NOZACAS-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1673; RV64IA-NOZACAS-NEXT: lr.w a4, (a2) 1674; RV64IA-NOZACAS-NEXT: add a5, a4, a1 1675; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 1676; RV64IA-NOZACAS-NEXT: and a5, a5, a3 1677; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 1678; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 1679; RV64IA-NOZACAS-NEXT: bnez a5, .LBB15_1 1680; RV64IA-NOZACAS-NEXT: # %bb.2: 1681; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 1682; RV64IA-NOZACAS-NEXT: ret 1683; 1684; RV64IA-ZACAS-LABEL: atomicrmw_add_i8_monotonic: 1685; RV64IA-ZACAS: # %bb.0: 1686; RV64IA-ZACAS-NEXT: andi a2, a0, -4 1687; RV64IA-ZACAS-NEXT: slli a0, a0, 3 1688; RV64IA-ZACAS-NEXT: li a3, 255 1689; RV64IA-ZACAS-NEXT: andi a1, a1, 255 1690; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 1691; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 1692; RV64IA-ZACAS-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1 1693; RV64IA-ZACAS-NEXT: lr.w a4, (a2) 1694; RV64IA-ZACAS-NEXT: add a5, a4, a1 1695; RV64IA-ZACAS-NEXT: xor a5, a4, a5 1696; RV64IA-ZACAS-NEXT: and a5, a5, a3 1697; RV64IA-ZACAS-NEXT: xor a5, a4, a5 1698; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 1699; RV64IA-ZACAS-NEXT: bnez a5, .LBB15_1 1700; RV64IA-ZACAS-NEXT: # %bb.2: 1701; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 1702; RV64IA-ZACAS-NEXT: ret 1703; 1704; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_monotonic: 1705; RV64IA-WMO-ZABHA: # %bb.0: 1706; RV64IA-WMO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 1707; RV64IA-WMO-ZABHA-NEXT: ret 1708; 1709; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_monotonic: 1710; RV64IA-TSO-ZABHA: # %bb.0: 1711; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 1712; RV64IA-TSO-ZABHA-NEXT: ret 1713 %1 = atomicrmw add ptr %a, i8 %b monotonic 1714 ret i8 %1 1715} 1716 1717define i8 @atomicrmw_add_i8_acquire(ptr %a, i8 %b) nounwind { 1718; RV32I-LABEL: atomicrmw_add_i8_acquire: 1719; RV32I: # %bb.0: 1720; RV32I-NEXT: addi sp, sp, -16 1721; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1722; RV32I-NEXT: li a2, 2 1723; RV32I-NEXT: call __atomic_fetch_add_1 1724; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1725; RV32I-NEXT: addi sp, sp, 16 1726; RV32I-NEXT: ret 1727; 1728; RV32IA-WMO-LABEL: atomicrmw_add_i8_acquire: 1729; RV32IA-WMO: # %bb.0: 1730; RV32IA-WMO-NEXT: andi a2, a0, -4 1731; RV32IA-WMO-NEXT: slli a0, a0, 3 1732; RV32IA-WMO-NEXT: li a3, 255 1733; RV32IA-WMO-NEXT: andi a1, a1, 255 1734; RV32IA-WMO-NEXT: sll a3, a3, a0 1735; RV32IA-WMO-NEXT: sll a1, a1, a0 1736; RV32IA-WMO-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1737; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 1738; RV32IA-WMO-NEXT: add a5, a4, a1 1739; RV32IA-WMO-NEXT: xor a5, a4, a5 1740; RV32IA-WMO-NEXT: and a5, a5, a3 1741; RV32IA-WMO-NEXT: xor a5, a4, a5 1742; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 1743; RV32IA-WMO-NEXT: bnez a5, .LBB16_1 1744; RV32IA-WMO-NEXT: # %bb.2: 1745; RV32IA-WMO-NEXT: srl a0, a4, a0 1746; RV32IA-WMO-NEXT: ret 1747; 1748; RV32IA-TSO-LABEL: atomicrmw_add_i8_acquire: 1749; RV32IA-TSO: # %bb.0: 1750; RV32IA-TSO-NEXT: andi a2, a0, -4 1751; RV32IA-TSO-NEXT: slli a0, a0, 3 1752; RV32IA-TSO-NEXT: li a3, 255 1753; RV32IA-TSO-NEXT: andi a1, a1, 255 1754; RV32IA-TSO-NEXT: sll a3, a3, a0 1755; RV32IA-TSO-NEXT: sll a1, a1, a0 1756; RV32IA-TSO-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1757; RV32IA-TSO-NEXT: lr.w a4, (a2) 1758; RV32IA-TSO-NEXT: add a5, a4, a1 1759; RV32IA-TSO-NEXT: xor a5, a4, a5 1760; RV32IA-TSO-NEXT: and a5, a5, a3 1761; RV32IA-TSO-NEXT: xor a5, a4, a5 1762; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 1763; RV32IA-TSO-NEXT: bnez a5, .LBB16_1 1764; RV32IA-TSO-NEXT: # %bb.2: 1765; RV32IA-TSO-NEXT: srl a0, a4, a0 1766; RV32IA-TSO-NEXT: ret 1767; 1768; RV64I-LABEL: atomicrmw_add_i8_acquire: 1769; RV64I: # %bb.0: 1770; RV64I-NEXT: addi sp, sp, -16 1771; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1772; RV64I-NEXT: li a2, 2 1773; RV64I-NEXT: call __atomic_fetch_add_1 1774; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1775; RV64I-NEXT: addi sp, sp, 16 1776; RV64I-NEXT: ret 1777; 1778; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_acquire: 1779; RV64IA-WMO-NOZACAS: # %bb.0: 1780; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 1781; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1782; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 1783; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 1784; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 1785; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 1786; RV64IA-WMO-NOZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1787; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 1788; RV64IA-WMO-NOZACAS-NEXT: add a5, a4, a1 1789; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 1790; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 1791; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 1792; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 1793; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB16_1 1794; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 1795; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 1796; RV64IA-WMO-NOZACAS-NEXT: ret 1797; 1798; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_acquire: 1799; RV64IA-TSO-NOZACAS: # %bb.0: 1800; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 1801; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1802; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 1803; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 1804; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 1805; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 1806; RV64IA-TSO-NOZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1807; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 1808; RV64IA-TSO-NOZACAS-NEXT: add a5, a4, a1 1809; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 1810; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 1811; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 1812; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 1813; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB16_1 1814; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 1815; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 1816; RV64IA-TSO-NOZACAS-NEXT: ret 1817; 1818; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_acquire: 1819; RV64IA-WMO-ZACAS: # %bb.0: 1820; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 1821; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1822; RV64IA-WMO-ZACAS-NEXT: li a3, 255 1823; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 1824; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 1825; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 1826; RV64IA-WMO-ZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1827; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 1828; RV64IA-WMO-ZACAS-NEXT: add a5, a4, a1 1829; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 1830; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 1831; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 1832; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 1833; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB16_1 1834; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 1835; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 1836; RV64IA-WMO-ZACAS-NEXT: ret 1837; 1838; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_acquire: 1839; RV64IA-TSO-ZACAS: # %bb.0: 1840; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 1841; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1842; RV64IA-TSO-ZACAS-NEXT: li a3, 255 1843; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 1844; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 1845; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 1846; RV64IA-TSO-ZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1 1847; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 1848; RV64IA-TSO-ZACAS-NEXT: add a5, a4, a1 1849; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 1850; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 1851; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 1852; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 1853; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB16_1 1854; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 1855; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 1856; RV64IA-TSO-ZACAS-NEXT: ret 1857; 1858; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_acquire: 1859; RV64IA-WMO-ZABHA: # %bb.0: 1860; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aq a0, a1, (a0) 1861; RV64IA-WMO-ZABHA-NEXT: ret 1862; 1863; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_acquire: 1864; RV64IA-TSO-ZABHA: # %bb.0: 1865; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 1866; RV64IA-TSO-ZABHA-NEXT: ret 1867 %1 = atomicrmw add ptr %a, i8 %b acquire 1868 ret i8 %1 1869} 1870 1871define i8 @atomicrmw_add_i8_release(ptr %a, i8 %b) nounwind { 1872; RV32I-LABEL: atomicrmw_add_i8_release: 1873; RV32I: # %bb.0: 1874; RV32I-NEXT: addi sp, sp, -16 1875; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1876; RV32I-NEXT: li a2, 3 1877; RV32I-NEXT: call __atomic_fetch_add_1 1878; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1879; RV32I-NEXT: addi sp, sp, 16 1880; RV32I-NEXT: ret 1881; 1882; RV32IA-WMO-LABEL: atomicrmw_add_i8_release: 1883; RV32IA-WMO: # %bb.0: 1884; RV32IA-WMO-NEXT: andi a2, a0, -4 1885; RV32IA-WMO-NEXT: slli a0, a0, 3 1886; RV32IA-WMO-NEXT: li a3, 255 1887; RV32IA-WMO-NEXT: andi a1, a1, 255 1888; RV32IA-WMO-NEXT: sll a3, a3, a0 1889; RV32IA-WMO-NEXT: sll a1, a1, a0 1890; RV32IA-WMO-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 1891; RV32IA-WMO-NEXT: lr.w a4, (a2) 1892; RV32IA-WMO-NEXT: add a5, a4, a1 1893; RV32IA-WMO-NEXT: xor a5, a4, a5 1894; RV32IA-WMO-NEXT: and a5, a5, a3 1895; RV32IA-WMO-NEXT: xor a5, a4, a5 1896; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 1897; RV32IA-WMO-NEXT: bnez a5, .LBB17_1 1898; RV32IA-WMO-NEXT: # %bb.2: 1899; RV32IA-WMO-NEXT: srl a0, a4, a0 1900; RV32IA-WMO-NEXT: ret 1901; 1902; RV32IA-TSO-LABEL: atomicrmw_add_i8_release: 1903; RV32IA-TSO: # %bb.0: 1904; RV32IA-TSO-NEXT: andi a2, a0, -4 1905; RV32IA-TSO-NEXT: slli a0, a0, 3 1906; RV32IA-TSO-NEXT: li a3, 255 1907; RV32IA-TSO-NEXT: andi a1, a1, 255 1908; RV32IA-TSO-NEXT: sll a3, a3, a0 1909; RV32IA-TSO-NEXT: sll a1, a1, a0 1910; RV32IA-TSO-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 1911; RV32IA-TSO-NEXT: lr.w a4, (a2) 1912; RV32IA-TSO-NEXT: add a5, a4, a1 1913; RV32IA-TSO-NEXT: xor a5, a4, a5 1914; RV32IA-TSO-NEXT: and a5, a5, a3 1915; RV32IA-TSO-NEXT: xor a5, a4, a5 1916; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 1917; RV32IA-TSO-NEXT: bnez a5, .LBB17_1 1918; RV32IA-TSO-NEXT: # %bb.2: 1919; RV32IA-TSO-NEXT: srl a0, a4, a0 1920; RV32IA-TSO-NEXT: ret 1921; 1922; RV64I-LABEL: atomicrmw_add_i8_release: 1923; RV64I: # %bb.0: 1924; RV64I-NEXT: addi sp, sp, -16 1925; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1926; RV64I-NEXT: li a2, 3 1927; RV64I-NEXT: call __atomic_fetch_add_1 1928; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1929; RV64I-NEXT: addi sp, sp, 16 1930; RV64I-NEXT: ret 1931; 1932; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_release: 1933; RV64IA-WMO-NOZACAS: # %bb.0: 1934; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 1935; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 1936; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 1937; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 1938; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 1939; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 1940; RV64IA-WMO-NOZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 1941; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2) 1942; RV64IA-WMO-NOZACAS-NEXT: add a5, a4, a1 1943; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 1944; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 1945; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 1946; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 1947; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB17_1 1948; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 1949; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 1950; RV64IA-WMO-NOZACAS-NEXT: ret 1951; 1952; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_release: 1953; RV64IA-TSO-NOZACAS: # %bb.0: 1954; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 1955; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 1956; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 1957; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 1958; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 1959; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 1960; RV64IA-TSO-NOZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 1961; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 1962; RV64IA-TSO-NOZACAS-NEXT: add a5, a4, a1 1963; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 1964; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 1965; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 1966; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 1967; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB17_1 1968; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 1969; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 1970; RV64IA-TSO-NOZACAS-NEXT: ret 1971; 1972; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_release: 1973; RV64IA-WMO-ZACAS: # %bb.0: 1974; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 1975; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 1976; RV64IA-WMO-ZACAS-NEXT: li a3, 255 1977; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 1978; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 1979; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 1980; RV64IA-WMO-ZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 1981; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2) 1982; RV64IA-WMO-ZACAS-NEXT: add a5, a4, a1 1983; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 1984; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 1985; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 1986; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 1987; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB17_1 1988; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 1989; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 1990; RV64IA-WMO-ZACAS-NEXT: ret 1991; 1992; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_release: 1993; RV64IA-TSO-ZACAS: # %bb.0: 1994; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 1995; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 1996; RV64IA-TSO-ZACAS-NEXT: li a3, 255 1997; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 1998; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 1999; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 2000; RV64IA-TSO-ZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1 2001; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 2002; RV64IA-TSO-ZACAS-NEXT: add a5, a4, a1 2003; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2004; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 2005; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2006; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 2007; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB17_1 2008; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 2009; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 2010; RV64IA-TSO-ZACAS-NEXT: ret 2011; 2012; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_release: 2013; RV64IA-WMO-ZABHA: # %bb.0: 2014; RV64IA-WMO-ZABHA-NEXT: amoadd.b.rl a0, a1, (a0) 2015; RV64IA-WMO-ZABHA-NEXT: ret 2016; 2017; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_release: 2018; RV64IA-TSO-ZABHA: # %bb.0: 2019; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2020; RV64IA-TSO-ZABHA-NEXT: ret 2021 %1 = atomicrmw add ptr %a, i8 %b release 2022 ret i8 %1 2023} 2024 2025define i8 @atomicrmw_add_i8_acq_rel(ptr %a, i8 %b) nounwind { 2026; RV32I-LABEL: atomicrmw_add_i8_acq_rel: 2027; RV32I: # %bb.0: 2028; RV32I-NEXT: addi sp, sp, -16 2029; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2030; RV32I-NEXT: li a2, 4 2031; RV32I-NEXT: call __atomic_fetch_add_1 2032; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2033; RV32I-NEXT: addi sp, sp, 16 2034; RV32I-NEXT: ret 2035; 2036; RV32IA-WMO-LABEL: atomicrmw_add_i8_acq_rel: 2037; RV32IA-WMO: # %bb.0: 2038; RV32IA-WMO-NEXT: andi a2, a0, -4 2039; RV32IA-WMO-NEXT: slli a0, a0, 3 2040; RV32IA-WMO-NEXT: li a3, 255 2041; RV32IA-WMO-NEXT: andi a1, a1, 255 2042; RV32IA-WMO-NEXT: sll a3, a3, a0 2043; RV32IA-WMO-NEXT: sll a1, a1, a0 2044; RV32IA-WMO-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 2045; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 2046; RV32IA-WMO-NEXT: add a5, a4, a1 2047; RV32IA-WMO-NEXT: xor a5, a4, a5 2048; RV32IA-WMO-NEXT: and a5, a5, a3 2049; RV32IA-WMO-NEXT: xor a5, a4, a5 2050; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 2051; RV32IA-WMO-NEXT: bnez a5, .LBB18_1 2052; RV32IA-WMO-NEXT: # %bb.2: 2053; RV32IA-WMO-NEXT: srl a0, a4, a0 2054; RV32IA-WMO-NEXT: ret 2055; 2056; RV32IA-TSO-LABEL: atomicrmw_add_i8_acq_rel: 2057; RV32IA-TSO: # %bb.0: 2058; RV32IA-TSO-NEXT: andi a2, a0, -4 2059; RV32IA-TSO-NEXT: slli a0, a0, 3 2060; RV32IA-TSO-NEXT: li a3, 255 2061; RV32IA-TSO-NEXT: andi a1, a1, 255 2062; RV32IA-TSO-NEXT: sll a3, a3, a0 2063; RV32IA-TSO-NEXT: sll a1, a1, a0 2064; RV32IA-TSO-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 2065; RV32IA-TSO-NEXT: lr.w a4, (a2) 2066; RV32IA-TSO-NEXT: add a5, a4, a1 2067; RV32IA-TSO-NEXT: xor a5, a4, a5 2068; RV32IA-TSO-NEXT: and a5, a5, a3 2069; RV32IA-TSO-NEXT: xor a5, a4, a5 2070; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 2071; RV32IA-TSO-NEXT: bnez a5, .LBB18_1 2072; RV32IA-TSO-NEXT: # %bb.2: 2073; RV32IA-TSO-NEXT: srl a0, a4, a0 2074; RV32IA-TSO-NEXT: ret 2075; 2076; RV64I-LABEL: atomicrmw_add_i8_acq_rel: 2077; RV64I: # %bb.0: 2078; RV64I-NEXT: addi sp, sp, -16 2079; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2080; RV64I-NEXT: li a2, 4 2081; RV64I-NEXT: call __atomic_fetch_add_1 2082; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2083; RV64I-NEXT: addi sp, sp, 16 2084; RV64I-NEXT: ret 2085; 2086; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_acq_rel: 2087; RV64IA-WMO-NOZACAS: # %bb.0: 2088; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 2089; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 2090; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 2091; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 2092; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 2093; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 2094; RV64IA-WMO-NOZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 2095; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 2096; RV64IA-WMO-NOZACAS-NEXT: add a5, a4, a1 2097; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2098; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 2099; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2100; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 2101; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB18_1 2102; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 2103; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 2104; RV64IA-WMO-NOZACAS-NEXT: ret 2105; 2106; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_acq_rel: 2107; RV64IA-TSO-NOZACAS: # %bb.0: 2108; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 2109; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 2110; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 2111; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 2112; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 2113; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 2114; RV64IA-TSO-NOZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 2115; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 2116; RV64IA-TSO-NOZACAS-NEXT: add a5, a4, a1 2117; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2118; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 2119; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2120; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 2121; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB18_1 2122; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 2123; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 2124; RV64IA-TSO-NOZACAS-NEXT: ret 2125; 2126; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_acq_rel: 2127; RV64IA-WMO-ZACAS: # %bb.0: 2128; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 2129; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 2130; RV64IA-WMO-ZACAS-NEXT: li a3, 255 2131; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 2132; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 2133; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 2134; RV64IA-WMO-ZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 2135; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 2136; RV64IA-WMO-ZACAS-NEXT: add a5, a4, a1 2137; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2138; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 2139; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2140; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 2141; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB18_1 2142; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 2143; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 2144; RV64IA-WMO-ZACAS-NEXT: ret 2145; 2146; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_acq_rel: 2147; RV64IA-TSO-ZACAS: # %bb.0: 2148; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 2149; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 2150; RV64IA-TSO-ZACAS-NEXT: li a3, 255 2151; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 2152; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 2153; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 2154; RV64IA-TSO-ZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1 2155; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 2156; RV64IA-TSO-ZACAS-NEXT: add a5, a4, a1 2157; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2158; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 2159; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2160; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 2161; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB18_1 2162; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 2163; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 2164; RV64IA-TSO-ZACAS-NEXT: ret 2165; 2166; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_acq_rel: 2167; RV64IA-WMO-ZABHA: # %bb.0: 2168; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0) 2169; RV64IA-WMO-ZABHA-NEXT: ret 2170; 2171; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_acq_rel: 2172; RV64IA-TSO-ZABHA: # %bb.0: 2173; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2174; RV64IA-TSO-ZABHA-NEXT: ret 2175 %1 = atomicrmw add ptr %a, i8 %b acq_rel 2176 ret i8 %1 2177} 2178 2179define i8 @atomicrmw_add_i8_seq_cst(ptr %a, i8 %b) nounwind { 2180; RV32I-LABEL: atomicrmw_add_i8_seq_cst: 2181; RV32I: # %bb.0: 2182; RV32I-NEXT: addi sp, sp, -16 2183; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2184; RV32I-NEXT: li a2, 5 2185; RV32I-NEXT: call __atomic_fetch_add_1 2186; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2187; RV32I-NEXT: addi sp, sp, 16 2188; RV32I-NEXT: ret 2189; 2190; RV32IA-LABEL: atomicrmw_add_i8_seq_cst: 2191; RV32IA: # %bb.0: 2192; RV32IA-NEXT: andi a2, a0, -4 2193; RV32IA-NEXT: slli a0, a0, 3 2194; RV32IA-NEXT: li a3, 255 2195; RV32IA-NEXT: andi a1, a1, 255 2196; RV32IA-NEXT: sll a3, a3, a0 2197; RV32IA-NEXT: sll a1, a1, a0 2198; RV32IA-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1 2199; RV32IA-NEXT: lr.w.aqrl a4, (a2) 2200; RV32IA-NEXT: add a5, a4, a1 2201; RV32IA-NEXT: xor a5, a4, a5 2202; RV32IA-NEXT: and a5, a5, a3 2203; RV32IA-NEXT: xor a5, a4, a5 2204; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 2205; RV32IA-NEXT: bnez a5, .LBB19_1 2206; RV32IA-NEXT: # %bb.2: 2207; RV32IA-NEXT: srl a0, a4, a0 2208; RV32IA-NEXT: ret 2209; 2210; RV64I-LABEL: atomicrmw_add_i8_seq_cst: 2211; RV64I: # %bb.0: 2212; RV64I-NEXT: addi sp, sp, -16 2213; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2214; RV64I-NEXT: li a2, 5 2215; RV64I-NEXT: call __atomic_fetch_add_1 2216; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2217; RV64I-NEXT: addi sp, sp, 16 2218; RV64I-NEXT: ret 2219; 2220; RV64IA-NOZACAS-LABEL: atomicrmw_add_i8_seq_cst: 2221; RV64IA-NOZACAS: # %bb.0: 2222; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 2223; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 2224; RV64IA-NOZACAS-NEXT: li a3, 255 2225; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 2226; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 2227; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 2228; RV64IA-NOZACAS-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1 2229; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 2230; RV64IA-NOZACAS-NEXT: add a5, a4, a1 2231; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 2232; RV64IA-NOZACAS-NEXT: and a5, a5, a3 2233; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 2234; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 2235; RV64IA-NOZACAS-NEXT: bnez a5, .LBB19_1 2236; RV64IA-NOZACAS-NEXT: # %bb.2: 2237; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 2238; RV64IA-NOZACAS-NEXT: ret 2239; 2240; RV64IA-ZACAS-LABEL: atomicrmw_add_i8_seq_cst: 2241; RV64IA-ZACAS: # %bb.0: 2242; RV64IA-ZACAS-NEXT: andi a2, a0, -4 2243; RV64IA-ZACAS-NEXT: slli a0, a0, 3 2244; RV64IA-ZACAS-NEXT: li a3, 255 2245; RV64IA-ZACAS-NEXT: andi a1, a1, 255 2246; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 2247; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 2248; RV64IA-ZACAS-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1 2249; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2) 2250; RV64IA-ZACAS-NEXT: add a5, a4, a1 2251; RV64IA-ZACAS-NEXT: xor a5, a4, a5 2252; RV64IA-ZACAS-NEXT: and a5, a5, a3 2253; RV64IA-ZACAS-NEXT: xor a5, a4, a5 2254; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 2255; RV64IA-ZACAS-NEXT: bnez a5, .LBB19_1 2256; RV64IA-ZACAS-NEXT: # %bb.2: 2257; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 2258; RV64IA-ZACAS-NEXT: ret 2259; 2260; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_seq_cst: 2261; RV64IA-WMO-ZABHA: # %bb.0: 2262; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0) 2263; RV64IA-WMO-ZABHA-NEXT: ret 2264; 2265; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_seq_cst: 2266; RV64IA-TSO-ZABHA: # %bb.0: 2267; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2268; RV64IA-TSO-ZABHA-NEXT: ret 2269 %1 = atomicrmw add ptr %a, i8 %b seq_cst 2270 ret i8 %1 2271} 2272 2273define i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind { 2274; RV32I-LABEL: atomicrmw_sub_i8_monotonic: 2275; RV32I: # %bb.0: 2276; RV32I-NEXT: addi sp, sp, -16 2277; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2278; RV32I-NEXT: li a2, 0 2279; RV32I-NEXT: call __atomic_fetch_sub_1 2280; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2281; RV32I-NEXT: addi sp, sp, 16 2282; RV32I-NEXT: ret 2283; 2284; RV32IA-LABEL: atomicrmw_sub_i8_monotonic: 2285; RV32IA: # %bb.0: 2286; RV32IA-NEXT: andi a2, a0, -4 2287; RV32IA-NEXT: slli a0, a0, 3 2288; RV32IA-NEXT: li a3, 255 2289; RV32IA-NEXT: andi a1, a1, 255 2290; RV32IA-NEXT: sll a3, a3, a0 2291; RV32IA-NEXT: sll a1, a1, a0 2292; RV32IA-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 2293; RV32IA-NEXT: lr.w a4, (a2) 2294; RV32IA-NEXT: sub a5, a4, a1 2295; RV32IA-NEXT: xor a5, a4, a5 2296; RV32IA-NEXT: and a5, a5, a3 2297; RV32IA-NEXT: xor a5, a4, a5 2298; RV32IA-NEXT: sc.w a5, a5, (a2) 2299; RV32IA-NEXT: bnez a5, .LBB20_1 2300; RV32IA-NEXT: # %bb.2: 2301; RV32IA-NEXT: srl a0, a4, a0 2302; RV32IA-NEXT: ret 2303; 2304; RV64I-LABEL: atomicrmw_sub_i8_monotonic: 2305; RV64I: # %bb.0: 2306; RV64I-NEXT: addi sp, sp, -16 2307; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2308; RV64I-NEXT: li a2, 0 2309; RV64I-NEXT: call __atomic_fetch_sub_1 2310; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2311; RV64I-NEXT: addi sp, sp, 16 2312; RV64I-NEXT: ret 2313; 2314; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i8_monotonic: 2315; RV64IA-NOZACAS: # %bb.0: 2316; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 2317; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 2318; RV64IA-NOZACAS-NEXT: li a3, 255 2319; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 2320; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 2321; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 2322; RV64IA-NOZACAS-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 2323; RV64IA-NOZACAS-NEXT: lr.w a4, (a2) 2324; RV64IA-NOZACAS-NEXT: sub a5, a4, a1 2325; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 2326; RV64IA-NOZACAS-NEXT: and a5, a5, a3 2327; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 2328; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 2329; RV64IA-NOZACAS-NEXT: bnez a5, .LBB20_1 2330; RV64IA-NOZACAS-NEXT: # %bb.2: 2331; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 2332; RV64IA-NOZACAS-NEXT: ret 2333; 2334; RV64IA-ZACAS-LABEL: atomicrmw_sub_i8_monotonic: 2335; RV64IA-ZACAS: # %bb.0: 2336; RV64IA-ZACAS-NEXT: andi a2, a0, -4 2337; RV64IA-ZACAS-NEXT: slli a0, a0, 3 2338; RV64IA-ZACAS-NEXT: li a3, 255 2339; RV64IA-ZACAS-NEXT: andi a1, a1, 255 2340; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 2341; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 2342; RV64IA-ZACAS-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1 2343; RV64IA-ZACAS-NEXT: lr.w a4, (a2) 2344; RV64IA-ZACAS-NEXT: sub a5, a4, a1 2345; RV64IA-ZACAS-NEXT: xor a5, a4, a5 2346; RV64IA-ZACAS-NEXT: and a5, a5, a3 2347; RV64IA-ZACAS-NEXT: xor a5, a4, a5 2348; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 2349; RV64IA-ZACAS-NEXT: bnez a5, .LBB20_1 2350; RV64IA-ZACAS-NEXT: # %bb.2: 2351; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 2352; RV64IA-ZACAS-NEXT: ret 2353; 2354; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_monotonic: 2355; RV64IA-WMO-ZABHA: # %bb.0: 2356; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 2357; RV64IA-WMO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2358; RV64IA-WMO-ZABHA-NEXT: ret 2359; 2360; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_monotonic: 2361; RV64IA-TSO-ZABHA: # %bb.0: 2362; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 2363; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2364; RV64IA-TSO-ZABHA-NEXT: ret 2365 %1 = atomicrmw sub ptr %a, i8 %b monotonic 2366 ret i8 %1 2367} 2368 2369define i8 @atomicrmw_sub_i8_acquire(ptr %a, i8 %b) nounwind { 2370; RV32I-LABEL: atomicrmw_sub_i8_acquire: 2371; RV32I: # %bb.0: 2372; RV32I-NEXT: addi sp, sp, -16 2373; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2374; RV32I-NEXT: li a2, 2 2375; RV32I-NEXT: call __atomic_fetch_sub_1 2376; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2377; RV32I-NEXT: addi sp, sp, 16 2378; RV32I-NEXT: ret 2379; 2380; RV32IA-WMO-LABEL: atomicrmw_sub_i8_acquire: 2381; RV32IA-WMO: # %bb.0: 2382; RV32IA-WMO-NEXT: andi a2, a0, -4 2383; RV32IA-WMO-NEXT: slli a0, a0, 3 2384; RV32IA-WMO-NEXT: li a3, 255 2385; RV32IA-WMO-NEXT: andi a1, a1, 255 2386; RV32IA-WMO-NEXT: sll a3, a3, a0 2387; RV32IA-WMO-NEXT: sll a1, a1, a0 2388; RV32IA-WMO-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 2389; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 2390; RV32IA-WMO-NEXT: sub a5, a4, a1 2391; RV32IA-WMO-NEXT: xor a5, a4, a5 2392; RV32IA-WMO-NEXT: and a5, a5, a3 2393; RV32IA-WMO-NEXT: xor a5, a4, a5 2394; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 2395; RV32IA-WMO-NEXT: bnez a5, .LBB21_1 2396; RV32IA-WMO-NEXT: # %bb.2: 2397; RV32IA-WMO-NEXT: srl a0, a4, a0 2398; RV32IA-WMO-NEXT: ret 2399; 2400; RV32IA-TSO-LABEL: atomicrmw_sub_i8_acquire: 2401; RV32IA-TSO: # %bb.0: 2402; RV32IA-TSO-NEXT: andi a2, a0, -4 2403; RV32IA-TSO-NEXT: slli a0, a0, 3 2404; RV32IA-TSO-NEXT: li a3, 255 2405; RV32IA-TSO-NEXT: andi a1, a1, 255 2406; RV32IA-TSO-NEXT: sll a3, a3, a0 2407; RV32IA-TSO-NEXT: sll a1, a1, a0 2408; RV32IA-TSO-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 2409; RV32IA-TSO-NEXT: lr.w a4, (a2) 2410; RV32IA-TSO-NEXT: sub a5, a4, a1 2411; RV32IA-TSO-NEXT: xor a5, a4, a5 2412; RV32IA-TSO-NEXT: and a5, a5, a3 2413; RV32IA-TSO-NEXT: xor a5, a4, a5 2414; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 2415; RV32IA-TSO-NEXT: bnez a5, .LBB21_1 2416; RV32IA-TSO-NEXT: # %bb.2: 2417; RV32IA-TSO-NEXT: srl a0, a4, a0 2418; RV32IA-TSO-NEXT: ret 2419; 2420; RV64I-LABEL: atomicrmw_sub_i8_acquire: 2421; RV64I: # %bb.0: 2422; RV64I-NEXT: addi sp, sp, -16 2423; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2424; RV64I-NEXT: li a2, 2 2425; RV64I-NEXT: call __atomic_fetch_sub_1 2426; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2427; RV64I-NEXT: addi sp, sp, 16 2428; RV64I-NEXT: ret 2429; 2430; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_acquire: 2431; RV64IA-WMO-NOZACAS: # %bb.0: 2432; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 2433; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 2434; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 2435; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 2436; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 2437; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 2438; RV64IA-WMO-NOZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 2439; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 2440; RV64IA-WMO-NOZACAS-NEXT: sub a5, a4, a1 2441; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2442; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 2443; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2444; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 2445; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB21_1 2446; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 2447; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 2448; RV64IA-WMO-NOZACAS-NEXT: ret 2449; 2450; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_acquire: 2451; RV64IA-TSO-NOZACAS: # %bb.0: 2452; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 2453; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 2454; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 2455; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 2456; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 2457; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 2458; RV64IA-TSO-NOZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 2459; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 2460; RV64IA-TSO-NOZACAS-NEXT: sub a5, a4, a1 2461; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2462; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 2463; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2464; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 2465; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB21_1 2466; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 2467; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 2468; RV64IA-TSO-NOZACAS-NEXT: ret 2469; 2470; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_acquire: 2471; RV64IA-WMO-ZACAS: # %bb.0: 2472; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 2473; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 2474; RV64IA-WMO-ZACAS-NEXT: li a3, 255 2475; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 2476; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 2477; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 2478; RV64IA-WMO-ZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 2479; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 2480; RV64IA-WMO-ZACAS-NEXT: sub a5, a4, a1 2481; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2482; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 2483; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2484; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 2485; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB21_1 2486; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 2487; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 2488; RV64IA-WMO-ZACAS-NEXT: ret 2489; 2490; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_acquire: 2491; RV64IA-TSO-ZACAS: # %bb.0: 2492; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 2493; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 2494; RV64IA-TSO-ZACAS-NEXT: li a3, 255 2495; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 2496; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 2497; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 2498; RV64IA-TSO-ZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1 2499; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 2500; RV64IA-TSO-ZACAS-NEXT: sub a5, a4, a1 2501; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2502; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 2503; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2504; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 2505; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB21_1 2506; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 2507; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 2508; RV64IA-TSO-ZACAS-NEXT: ret 2509; 2510; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_acquire: 2511; RV64IA-WMO-ZABHA: # %bb.0: 2512; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 2513; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aq a0, a1, (a0) 2514; RV64IA-WMO-ZABHA-NEXT: ret 2515; 2516; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_acquire: 2517; RV64IA-TSO-ZABHA: # %bb.0: 2518; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 2519; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2520; RV64IA-TSO-ZABHA-NEXT: ret 2521 %1 = atomicrmw sub ptr %a, i8 %b acquire 2522 ret i8 %1 2523} 2524 2525define i8 @atomicrmw_sub_i8_release(ptr %a, i8 %b) nounwind { 2526; RV32I-LABEL: atomicrmw_sub_i8_release: 2527; RV32I: # %bb.0: 2528; RV32I-NEXT: addi sp, sp, -16 2529; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2530; RV32I-NEXT: li a2, 3 2531; RV32I-NEXT: call __atomic_fetch_sub_1 2532; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2533; RV32I-NEXT: addi sp, sp, 16 2534; RV32I-NEXT: ret 2535; 2536; RV32IA-WMO-LABEL: atomicrmw_sub_i8_release: 2537; RV32IA-WMO: # %bb.0: 2538; RV32IA-WMO-NEXT: andi a2, a0, -4 2539; RV32IA-WMO-NEXT: slli a0, a0, 3 2540; RV32IA-WMO-NEXT: li a3, 255 2541; RV32IA-WMO-NEXT: andi a1, a1, 255 2542; RV32IA-WMO-NEXT: sll a3, a3, a0 2543; RV32IA-WMO-NEXT: sll a1, a1, a0 2544; RV32IA-WMO-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 2545; RV32IA-WMO-NEXT: lr.w a4, (a2) 2546; RV32IA-WMO-NEXT: sub a5, a4, a1 2547; RV32IA-WMO-NEXT: xor a5, a4, a5 2548; RV32IA-WMO-NEXT: and a5, a5, a3 2549; RV32IA-WMO-NEXT: xor a5, a4, a5 2550; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 2551; RV32IA-WMO-NEXT: bnez a5, .LBB22_1 2552; RV32IA-WMO-NEXT: # %bb.2: 2553; RV32IA-WMO-NEXT: srl a0, a4, a0 2554; RV32IA-WMO-NEXT: ret 2555; 2556; RV32IA-TSO-LABEL: atomicrmw_sub_i8_release: 2557; RV32IA-TSO: # %bb.0: 2558; RV32IA-TSO-NEXT: andi a2, a0, -4 2559; RV32IA-TSO-NEXT: slli a0, a0, 3 2560; RV32IA-TSO-NEXT: li a3, 255 2561; RV32IA-TSO-NEXT: andi a1, a1, 255 2562; RV32IA-TSO-NEXT: sll a3, a3, a0 2563; RV32IA-TSO-NEXT: sll a1, a1, a0 2564; RV32IA-TSO-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 2565; RV32IA-TSO-NEXT: lr.w a4, (a2) 2566; RV32IA-TSO-NEXT: sub a5, a4, a1 2567; RV32IA-TSO-NEXT: xor a5, a4, a5 2568; RV32IA-TSO-NEXT: and a5, a5, a3 2569; RV32IA-TSO-NEXT: xor a5, a4, a5 2570; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 2571; RV32IA-TSO-NEXT: bnez a5, .LBB22_1 2572; RV32IA-TSO-NEXT: # %bb.2: 2573; RV32IA-TSO-NEXT: srl a0, a4, a0 2574; RV32IA-TSO-NEXT: ret 2575; 2576; RV64I-LABEL: atomicrmw_sub_i8_release: 2577; RV64I: # %bb.0: 2578; RV64I-NEXT: addi sp, sp, -16 2579; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2580; RV64I-NEXT: li a2, 3 2581; RV64I-NEXT: call __atomic_fetch_sub_1 2582; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2583; RV64I-NEXT: addi sp, sp, 16 2584; RV64I-NEXT: ret 2585; 2586; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_release: 2587; RV64IA-WMO-NOZACAS: # %bb.0: 2588; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 2589; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 2590; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 2591; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 2592; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 2593; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 2594; RV64IA-WMO-NOZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 2595; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2) 2596; RV64IA-WMO-NOZACAS-NEXT: sub a5, a4, a1 2597; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2598; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 2599; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2600; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 2601; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB22_1 2602; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 2603; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 2604; RV64IA-WMO-NOZACAS-NEXT: ret 2605; 2606; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_release: 2607; RV64IA-TSO-NOZACAS: # %bb.0: 2608; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 2609; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 2610; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 2611; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 2612; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 2613; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 2614; RV64IA-TSO-NOZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 2615; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 2616; RV64IA-TSO-NOZACAS-NEXT: sub a5, a4, a1 2617; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2618; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 2619; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2620; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 2621; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB22_1 2622; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 2623; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 2624; RV64IA-TSO-NOZACAS-NEXT: ret 2625; 2626; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_release: 2627; RV64IA-WMO-ZACAS: # %bb.0: 2628; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 2629; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 2630; RV64IA-WMO-ZACAS-NEXT: li a3, 255 2631; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 2632; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 2633; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 2634; RV64IA-WMO-ZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 2635; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2) 2636; RV64IA-WMO-ZACAS-NEXT: sub a5, a4, a1 2637; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2638; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 2639; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2640; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 2641; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB22_1 2642; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 2643; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 2644; RV64IA-WMO-ZACAS-NEXT: ret 2645; 2646; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_release: 2647; RV64IA-TSO-ZACAS: # %bb.0: 2648; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 2649; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 2650; RV64IA-TSO-ZACAS-NEXT: li a3, 255 2651; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 2652; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 2653; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 2654; RV64IA-TSO-ZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1 2655; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 2656; RV64IA-TSO-ZACAS-NEXT: sub a5, a4, a1 2657; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2658; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 2659; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2660; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 2661; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB22_1 2662; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 2663; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 2664; RV64IA-TSO-ZACAS-NEXT: ret 2665; 2666; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_release: 2667; RV64IA-WMO-ZABHA: # %bb.0: 2668; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 2669; RV64IA-WMO-ZABHA-NEXT: amoadd.b.rl a0, a1, (a0) 2670; RV64IA-WMO-ZABHA-NEXT: ret 2671; 2672; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_release: 2673; RV64IA-TSO-ZABHA: # %bb.0: 2674; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 2675; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2676; RV64IA-TSO-ZABHA-NEXT: ret 2677 %1 = atomicrmw sub ptr %a, i8 %b release 2678 ret i8 %1 2679} 2680 2681define i8 @atomicrmw_sub_i8_acq_rel(ptr %a, i8 %b) nounwind { 2682; RV32I-LABEL: atomicrmw_sub_i8_acq_rel: 2683; RV32I: # %bb.0: 2684; RV32I-NEXT: addi sp, sp, -16 2685; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2686; RV32I-NEXT: li a2, 4 2687; RV32I-NEXT: call __atomic_fetch_sub_1 2688; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2689; RV32I-NEXT: addi sp, sp, 16 2690; RV32I-NEXT: ret 2691; 2692; RV32IA-WMO-LABEL: atomicrmw_sub_i8_acq_rel: 2693; RV32IA-WMO: # %bb.0: 2694; RV32IA-WMO-NEXT: andi a2, a0, -4 2695; RV32IA-WMO-NEXT: slli a0, a0, 3 2696; RV32IA-WMO-NEXT: li a3, 255 2697; RV32IA-WMO-NEXT: andi a1, a1, 255 2698; RV32IA-WMO-NEXT: sll a3, a3, a0 2699; RV32IA-WMO-NEXT: sll a1, a1, a0 2700; RV32IA-WMO-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2701; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 2702; RV32IA-WMO-NEXT: sub a5, a4, a1 2703; RV32IA-WMO-NEXT: xor a5, a4, a5 2704; RV32IA-WMO-NEXT: and a5, a5, a3 2705; RV32IA-WMO-NEXT: xor a5, a4, a5 2706; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 2707; RV32IA-WMO-NEXT: bnez a5, .LBB23_1 2708; RV32IA-WMO-NEXT: # %bb.2: 2709; RV32IA-WMO-NEXT: srl a0, a4, a0 2710; RV32IA-WMO-NEXT: ret 2711; 2712; RV32IA-TSO-LABEL: atomicrmw_sub_i8_acq_rel: 2713; RV32IA-TSO: # %bb.0: 2714; RV32IA-TSO-NEXT: andi a2, a0, -4 2715; RV32IA-TSO-NEXT: slli a0, a0, 3 2716; RV32IA-TSO-NEXT: li a3, 255 2717; RV32IA-TSO-NEXT: andi a1, a1, 255 2718; RV32IA-TSO-NEXT: sll a3, a3, a0 2719; RV32IA-TSO-NEXT: sll a1, a1, a0 2720; RV32IA-TSO-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2721; RV32IA-TSO-NEXT: lr.w a4, (a2) 2722; RV32IA-TSO-NEXT: sub a5, a4, a1 2723; RV32IA-TSO-NEXT: xor a5, a4, a5 2724; RV32IA-TSO-NEXT: and a5, a5, a3 2725; RV32IA-TSO-NEXT: xor a5, a4, a5 2726; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 2727; RV32IA-TSO-NEXT: bnez a5, .LBB23_1 2728; RV32IA-TSO-NEXT: # %bb.2: 2729; RV32IA-TSO-NEXT: srl a0, a4, a0 2730; RV32IA-TSO-NEXT: ret 2731; 2732; RV64I-LABEL: atomicrmw_sub_i8_acq_rel: 2733; RV64I: # %bb.0: 2734; RV64I-NEXT: addi sp, sp, -16 2735; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2736; RV64I-NEXT: li a2, 4 2737; RV64I-NEXT: call __atomic_fetch_sub_1 2738; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2739; RV64I-NEXT: addi sp, sp, 16 2740; RV64I-NEXT: ret 2741; 2742; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_acq_rel: 2743; RV64IA-WMO-NOZACAS: # %bb.0: 2744; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 2745; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 2746; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 2747; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 2748; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 2749; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 2750; RV64IA-WMO-NOZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2751; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 2752; RV64IA-WMO-NOZACAS-NEXT: sub a5, a4, a1 2753; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2754; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 2755; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 2756; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 2757; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB23_1 2758; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 2759; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 2760; RV64IA-WMO-NOZACAS-NEXT: ret 2761; 2762; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_acq_rel: 2763; RV64IA-TSO-NOZACAS: # %bb.0: 2764; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 2765; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 2766; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 2767; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 2768; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 2769; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 2770; RV64IA-TSO-NOZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2771; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 2772; RV64IA-TSO-NOZACAS-NEXT: sub a5, a4, a1 2773; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2774; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 2775; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 2776; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 2777; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB23_1 2778; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 2779; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 2780; RV64IA-TSO-NOZACAS-NEXT: ret 2781; 2782; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_acq_rel: 2783; RV64IA-WMO-ZACAS: # %bb.0: 2784; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 2785; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 2786; RV64IA-WMO-ZACAS-NEXT: li a3, 255 2787; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 2788; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 2789; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 2790; RV64IA-WMO-ZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2791; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 2792; RV64IA-WMO-ZACAS-NEXT: sub a5, a4, a1 2793; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2794; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 2795; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 2796; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 2797; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB23_1 2798; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 2799; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 2800; RV64IA-WMO-ZACAS-NEXT: ret 2801; 2802; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_acq_rel: 2803; RV64IA-TSO-ZACAS: # %bb.0: 2804; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 2805; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 2806; RV64IA-TSO-ZACAS-NEXT: li a3, 255 2807; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 2808; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 2809; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 2810; RV64IA-TSO-ZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1 2811; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 2812; RV64IA-TSO-ZACAS-NEXT: sub a5, a4, a1 2813; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2814; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 2815; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 2816; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 2817; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB23_1 2818; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 2819; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 2820; RV64IA-TSO-ZACAS-NEXT: ret 2821; 2822; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_acq_rel: 2823; RV64IA-WMO-ZABHA: # %bb.0: 2824; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 2825; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0) 2826; RV64IA-WMO-ZABHA-NEXT: ret 2827; 2828; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_acq_rel: 2829; RV64IA-TSO-ZABHA: # %bb.0: 2830; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 2831; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2832; RV64IA-TSO-ZABHA-NEXT: ret 2833 %1 = atomicrmw sub ptr %a, i8 %b acq_rel 2834 ret i8 %1 2835} 2836 2837define i8 @atomicrmw_sub_i8_seq_cst(ptr %a, i8 %b) nounwind { 2838; RV32I-LABEL: atomicrmw_sub_i8_seq_cst: 2839; RV32I: # %bb.0: 2840; RV32I-NEXT: addi sp, sp, -16 2841; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2842; RV32I-NEXT: li a2, 5 2843; RV32I-NEXT: call __atomic_fetch_sub_1 2844; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2845; RV32I-NEXT: addi sp, sp, 16 2846; RV32I-NEXT: ret 2847; 2848; RV32IA-LABEL: atomicrmw_sub_i8_seq_cst: 2849; RV32IA: # %bb.0: 2850; RV32IA-NEXT: andi a2, a0, -4 2851; RV32IA-NEXT: slli a0, a0, 3 2852; RV32IA-NEXT: li a3, 255 2853; RV32IA-NEXT: andi a1, a1, 255 2854; RV32IA-NEXT: sll a3, a3, a0 2855; RV32IA-NEXT: sll a1, a1, a0 2856; RV32IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2857; RV32IA-NEXT: lr.w.aqrl a4, (a2) 2858; RV32IA-NEXT: sub a5, a4, a1 2859; RV32IA-NEXT: xor a5, a4, a5 2860; RV32IA-NEXT: and a5, a5, a3 2861; RV32IA-NEXT: xor a5, a4, a5 2862; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 2863; RV32IA-NEXT: bnez a5, .LBB24_1 2864; RV32IA-NEXT: # %bb.2: 2865; RV32IA-NEXT: srl a0, a4, a0 2866; RV32IA-NEXT: ret 2867; 2868; RV64I-LABEL: atomicrmw_sub_i8_seq_cst: 2869; RV64I: # %bb.0: 2870; RV64I-NEXT: addi sp, sp, -16 2871; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2872; RV64I-NEXT: li a2, 5 2873; RV64I-NEXT: call __atomic_fetch_sub_1 2874; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2875; RV64I-NEXT: addi sp, sp, 16 2876; RV64I-NEXT: ret 2877; 2878; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i8_seq_cst: 2879; RV64IA-NOZACAS: # %bb.0: 2880; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 2881; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 2882; RV64IA-NOZACAS-NEXT: li a3, 255 2883; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 2884; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 2885; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 2886; RV64IA-NOZACAS-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2887; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 2888; RV64IA-NOZACAS-NEXT: sub a5, a4, a1 2889; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 2890; RV64IA-NOZACAS-NEXT: and a5, a5, a3 2891; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 2892; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 2893; RV64IA-NOZACAS-NEXT: bnez a5, .LBB24_1 2894; RV64IA-NOZACAS-NEXT: # %bb.2: 2895; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 2896; RV64IA-NOZACAS-NEXT: ret 2897; 2898; RV64IA-ZACAS-LABEL: atomicrmw_sub_i8_seq_cst: 2899; RV64IA-ZACAS: # %bb.0: 2900; RV64IA-ZACAS-NEXT: andi a2, a0, -4 2901; RV64IA-ZACAS-NEXT: slli a0, a0, 3 2902; RV64IA-ZACAS-NEXT: li a3, 255 2903; RV64IA-ZACAS-NEXT: andi a1, a1, 255 2904; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 2905; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 2906; RV64IA-ZACAS-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1 2907; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2) 2908; RV64IA-ZACAS-NEXT: sub a5, a4, a1 2909; RV64IA-ZACAS-NEXT: xor a5, a4, a5 2910; RV64IA-ZACAS-NEXT: and a5, a5, a3 2911; RV64IA-ZACAS-NEXT: xor a5, a4, a5 2912; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 2913; RV64IA-ZACAS-NEXT: bnez a5, .LBB24_1 2914; RV64IA-ZACAS-NEXT: # %bb.2: 2915; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 2916; RV64IA-ZACAS-NEXT: ret 2917; 2918; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_seq_cst: 2919; RV64IA-WMO-ZABHA: # %bb.0: 2920; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 2921; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0) 2922; RV64IA-WMO-ZABHA-NEXT: ret 2923; 2924; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_seq_cst: 2925; RV64IA-TSO-ZABHA: # %bb.0: 2926; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 2927; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0) 2928; RV64IA-TSO-ZABHA-NEXT: ret 2929 %1 = atomicrmw sub ptr %a, i8 %b seq_cst 2930 ret i8 %1 2931} 2932 2933define i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind { 2934; RV32I-LABEL: atomicrmw_and_i8_monotonic: 2935; RV32I: # %bb.0: 2936; RV32I-NEXT: addi sp, sp, -16 2937; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 2938; RV32I-NEXT: li a2, 0 2939; RV32I-NEXT: call __atomic_fetch_and_1 2940; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2941; RV32I-NEXT: addi sp, sp, 16 2942; RV32I-NEXT: ret 2943; 2944; RV32IA-LABEL: atomicrmw_and_i8_monotonic: 2945; RV32IA: # %bb.0: 2946; RV32IA-NEXT: andi a2, a0, -4 2947; RV32IA-NEXT: slli a0, a0, 3 2948; RV32IA-NEXT: li a3, 255 2949; RV32IA-NEXT: andi a1, a1, 255 2950; RV32IA-NEXT: sll a3, a3, a0 2951; RV32IA-NEXT: not a3, a3 2952; RV32IA-NEXT: sll a1, a1, a0 2953; RV32IA-NEXT: or a1, a1, a3 2954; RV32IA-NEXT: amoand.w a1, a1, (a2) 2955; RV32IA-NEXT: srl a0, a1, a0 2956; RV32IA-NEXT: ret 2957; 2958; RV64I-LABEL: atomicrmw_and_i8_monotonic: 2959; RV64I: # %bb.0: 2960; RV64I-NEXT: addi sp, sp, -16 2961; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 2962; RV64I-NEXT: li a2, 0 2963; RV64I-NEXT: call __atomic_fetch_and_1 2964; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2965; RV64I-NEXT: addi sp, sp, 16 2966; RV64I-NEXT: ret 2967; 2968; RV64IA-NOZACAS-LABEL: atomicrmw_and_i8_monotonic: 2969; RV64IA-NOZACAS: # %bb.0: 2970; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 2971; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 2972; RV64IA-NOZACAS-NEXT: li a3, 255 2973; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 2974; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 2975; RV64IA-NOZACAS-NEXT: not a3, a3 2976; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 2977; RV64IA-NOZACAS-NEXT: or a1, a1, a3 2978; RV64IA-NOZACAS-NEXT: amoand.w a1, a1, (a2) 2979; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 2980; RV64IA-NOZACAS-NEXT: ret 2981; 2982; RV64IA-ZACAS-LABEL: atomicrmw_and_i8_monotonic: 2983; RV64IA-ZACAS: # %bb.0: 2984; RV64IA-ZACAS-NEXT: andi a2, a0, -4 2985; RV64IA-ZACAS-NEXT: slli a0, a0, 3 2986; RV64IA-ZACAS-NEXT: li a3, 255 2987; RV64IA-ZACAS-NEXT: andi a1, a1, 255 2988; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 2989; RV64IA-ZACAS-NEXT: not a3, a3 2990; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 2991; RV64IA-ZACAS-NEXT: or a1, a1, a3 2992; RV64IA-ZACAS-NEXT: amoand.w a1, a1, (a2) 2993; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 2994; RV64IA-ZACAS-NEXT: ret 2995; 2996; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_monotonic: 2997; RV64IA-WMO-ZABHA: # %bb.0: 2998; RV64IA-WMO-ZABHA-NEXT: amoand.b a0, a1, (a0) 2999; RV64IA-WMO-ZABHA-NEXT: ret 3000; 3001; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_monotonic: 3002; RV64IA-TSO-ZABHA: # %bb.0: 3003; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0) 3004; RV64IA-TSO-ZABHA-NEXT: ret 3005 %1 = atomicrmw and ptr %a, i8 %b monotonic 3006 ret i8 %1 3007} 3008 3009define i8 @atomicrmw_and_i8_acquire(ptr %a, i8 %b) nounwind { 3010; RV32I-LABEL: atomicrmw_and_i8_acquire: 3011; RV32I: # %bb.0: 3012; RV32I-NEXT: addi sp, sp, -16 3013; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3014; RV32I-NEXT: li a2, 2 3015; RV32I-NEXT: call __atomic_fetch_and_1 3016; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3017; RV32I-NEXT: addi sp, sp, 16 3018; RV32I-NEXT: ret 3019; 3020; RV32IA-WMO-LABEL: atomicrmw_and_i8_acquire: 3021; RV32IA-WMO: # %bb.0: 3022; RV32IA-WMO-NEXT: andi a2, a0, -4 3023; RV32IA-WMO-NEXT: slli a0, a0, 3 3024; RV32IA-WMO-NEXT: li a3, 255 3025; RV32IA-WMO-NEXT: andi a1, a1, 255 3026; RV32IA-WMO-NEXT: sll a3, a3, a0 3027; RV32IA-WMO-NEXT: not a3, a3 3028; RV32IA-WMO-NEXT: sll a1, a1, a0 3029; RV32IA-WMO-NEXT: or a1, a1, a3 3030; RV32IA-WMO-NEXT: amoand.w.aq a1, a1, (a2) 3031; RV32IA-WMO-NEXT: srl a0, a1, a0 3032; RV32IA-WMO-NEXT: ret 3033; 3034; RV32IA-TSO-LABEL: atomicrmw_and_i8_acquire: 3035; RV32IA-TSO: # %bb.0: 3036; RV32IA-TSO-NEXT: andi a2, a0, -4 3037; RV32IA-TSO-NEXT: slli a0, a0, 3 3038; RV32IA-TSO-NEXT: li a3, 255 3039; RV32IA-TSO-NEXT: andi a1, a1, 255 3040; RV32IA-TSO-NEXT: sll a3, a3, a0 3041; RV32IA-TSO-NEXT: not a3, a3 3042; RV32IA-TSO-NEXT: sll a1, a1, a0 3043; RV32IA-TSO-NEXT: or a1, a1, a3 3044; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 3045; RV32IA-TSO-NEXT: srl a0, a1, a0 3046; RV32IA-TSO-NEXT: ret 3047; 3048; RV64I-LABEL: atomicrmw_and_i8_acquire: 3049; RV64I: # %bb.0: 3050; RV64I-NEXT: addi sp, sp, -16 3051; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3052; RV64I-NEXT: li a2, 2 3053; RV64I-NEXT: call __atomic_fetch_and_1 3054; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3055; RV64I-NEXT: addi sp, sp, 16 3056; RV64I-NEXT: ret 3057; 3058; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_acquire: 3059; RV64IA-WMO-NOZACAS: # %bb.0: 3060; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 3061; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 3062; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 3063; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 3064; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 3065; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 3066; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 3067; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 3068; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a1, (a2) 3069; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 3070; RV64IA-WMO-NOZACAS-NEXT: ret 3071; 3072; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_acquire: 3073; RV64IA-TSO-NOZACAS: # %bb.0: 3074; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 3075; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 3076; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 3077; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 3078; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 3079; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 3080; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 3081; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 3082; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 3083; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 3084; RV64IA-TSO-NOZACAS-NEXT: ret 3085; 3086; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_acquire: 3087; RV64IA-WMO-ZACAS: # %bb.0: 3088; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 3089; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 3090; RV64IA-WMO-ZACAS-NEXT: li a3, 255 3091; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 3092; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 3093; RV64IA-WMO-ZACAS-NEXT: not a3, a3 3094; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 3095; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 3096; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a1, (a2) 3097; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 3098; RV64IA-WMO-ZACAS-NEXT: ret 3099; 3100; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_acquire: 3101; RV64IA-TSO-ZACAS: # %bb.0: 3102; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 3103; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 3104; RV64IA-TSO-ZACAS-NEXT: li a3, 255 3105; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 3106; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 3107; RV64IA-TSO-ZACAS-NEXT: not a3, a3 3108; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 3109; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 3110; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 3111; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 3112; RV64IA-TSO-ZACAS-NEXT: ret 3113; 3114; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_acquire: 3115; RV64IA-WMO-ZABHA: # %bb.0: 3116; RV64IA-WMO-ZABHA-NEXT: amoand.b.aq a0, a1, (a0) 3117; RV64IA-WMO-ZABHA-NEXT: ret 3118; 3119; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_acquire: 3120; RV64IA-TSO-ZABHA: # %bb.0: 3121; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0) 3122; RV64IA-TSO-ZABHA-NEXT: ret 3123 %1 = atomicrmw and ptr %a, i8 %b acquire 3124 ret i8 %1 3125} 3126 3127define i8 @atomicrmw_and_i8_release(ptr %a, i8 %b) nounwind { 3128; RV32I-LABEL: atomicrmw_and_i8_release: 3129; RV32I: # %bb.0: 3130; RV32I-NEXT: addi sp, sp, -16 3131; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3132; RV32I-NEXT: li a2, 3 3133; RV32I-NEXT: call __atomic_fetch_and_1 3134; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3135; RV32I-NEXT: addi sp, sp, 16 3136; RV32I-NEXT: ret 3137; 3138; RV32IA-WMO-LABEL: atomicrmw_and_i8_release: 3139; RV32IA-WMO: # %bb.0: 3140; RV32IA-WMO-NEXT: andi a2, a0, -4 3141; RV32IA-WMO-NEXT: slli a0, a0, 3 3142; RV32IA-WMO-NEXT: li a3, 255 3143; RV32IA-WMO-NEXT: andi a1, a1, 255 3144; RV32IA-WMO-NEXT: sll a3, a3, a0 3145; RV32IA-WMO-NEXT: not a3, a3 3146; RV32IA-WMO-NEXT: sll a1, a1, a0 3147; RV32IA-WMO-NEXT: or a1, a1, a3 3148; RV32IA-WMO-NEXT: amoand.w.rl a1, a1, (a2) 3149; RV32IA-WMO-NEXT: srl a0, a1, a0 3150; RV32IA-WMO-NEXT: ret 3151; 3152; RV32IA-TSO-LABEL: atomicrmw_and_i8_release: 3153; RV32IA-TSO: # %bb.0: 3154; RV32IA-TSO-NEXT: andi a2, a0, -4 3155; RV32IA-TSO-NEXT: slli a0, a0, 3 3156; RV32IA-TSO-NEXT: li a3, 255 3157; RV32IA-TSO-NEXT: andi a1, a1, 255 3158; RV32IA-TSO-NEXT: sll a3, a3, a0 3159; RV32IA-TSO-NEXT: not a3, a3 3160; RV32IA-TSO-NEXT: sll a1, a1, a0 3161; RV32IA-TSO-NEXT: or a1, a1, a3 3162; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 3163; RV32IA-TSO-NEXT: srl a0, a1, a0 3164; RV32IA-TSO-NEXT: ret 3165; 3166; RV64I-LABEL: atomicrmw_and_i8_release: 3167; RV64I: # %bb.0: 3168; RV64I-NEXT: addi sp, sp, -16 3169; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3170; RV64I-NEXT: li a2, 3 3171; RV64I-NEXT: call __atomic_fetch_and_1 3172; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3173; RV64I-NEXT: addi sp, sp, 16 3174; RV64I-NEXT: ret 3175; 3176; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_release: 3177; RV64IA-WMO-NOZACAS: # %bb.0: 3178; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 3179; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 3180; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 3181; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 3182; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 3183; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 3184; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 3185; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 3186; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a1, (a2) 3187; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 3188; RV64IA-WMO-NOZACAS-NEXT: ret 3189; 3190; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_release: 3191; RV64IA-TSO-NOZACAS: # %bb.0: 3192; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 3193; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 3194; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 3195; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 3196; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 3197; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 3198; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 3199; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 3200; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 3201; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 3202; RV64IA-TSO-NOZACAS-NEXT: ret 3203; 3204; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_release: 3205; RV64IA-WMO-ZACAS: # %bb.0: 3206; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 3207; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 3208; RV64IA-WMO-ZACAS-NEXT: li a3, 255 3209; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 3210; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 3211; RV64IA-WMO-ZACAS-NEXT: not a3, a3 3212; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 3213; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 3214; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a1, (a2) 3215; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 3216; RV64IA-WMO-ZACAS-NEXT: ret 3217; 3218; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_release: 3219; RV64IA-TSO-ZACAS: # %bb.0: 3220; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 3221; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 3222; RV64IA-TSO-ZACAS-NEXT: li a3, 255 3223; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 3224; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 3225; RV64IA-TSO-ZACAS-NEXT: not a3, a3 3226; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 3227; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 3228; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 3229; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 3230; RV64IA-TSO-ZACAS-NEXT: ret 3231; 3232; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_release: 3233; RV64IA-WMO-ZABHA: # %bb.0: 3234; RV64IA-WMO-ZABHA-NEXT: amoand.b.rl a0, a1, (a0) 3235; RV64IA-WMO-ZABHA-NEXT: ret 3236; 3237; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_release: 3238; RV64IA-TSO-ZABHA: # %bb.0: 3239; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0) 3240; RV64IA-TSO-ZABHA-NEXT: ret 3241 %1 = atomicrmw and ptr %a, i8 %b release 3242 ret i8 %1 3243} 3244 3245define i8 @atomicrmw_and_i8_acq_rel(ptr %a, i8 %b) nounwind { 3246; RV32I-LABEL: atomicrmw_and_i8_acq_rel: 3247; RV32I: # %bb.0: 3248; RV32I-NEXT: addi sp, sp, -16 3249; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3250; RV32I-NEXT: li a2, 4 3251; RV32I-NEXT: call __atomic_fetch_and_1 3252; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3253; RV32I-NEXT: addi sp, sp, 16 3254; RV32I-NEXT: ret 3255; 3256; RV32IA-WMO-LABEL: atomicrmw_and_i8_acq_rel: 3257; RV32IA-WMO: # %bb.0: 3258; RV32IA-WMO-NEXT: andi a2, a0, -4 3259; RV32IA-WMO-NEXT: slli a0, a0, 3 3260; RV32IA-WMO-NEXT: li a3, 255 3261; RV32IA-WMO-NEXT: andi a1, a1, 255 3262; RV32IA-WMO-NEXT: sll a3, a3, a0 3263; RV32IA-WMO-NEXT: not a3, a3 3264; RV32IA-WMO-NEXT: sll a1, a1, a0 3265; RV32IA-WMO-NEXT: or a1, a1, a3 3266; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2) 3267; RV32IA-WMO-NEXT: srl a0, a1, a0 3268; RV32IA-WMO-NEXT: ret 3269; 3270; RV32IA-TSO-LABEL: atomicrmw_and_i8_acq_rel: 3271; RV32IA-TSO: # %bb.0: 3272; RV32IA-TSO-NEXT: andi a2, a0, -4 3273; RV32IA-TSO-NEXT: slli a0, a0, 3 3274; RV32IA-TSO-NEXT: li a3, 255 3275; RV32IA-TSO-NEXT: andi a1, a1, 255 3276; RV32IA-TSO-NEXT: sll a3, a3, a0 3277; RV32IA-TSO-NEXT: not a3, a3 3278; RV32IA-TSO-NEXT: sll a1, a1, a0 3279; RV32IA-TSO-NEXT: or a1, a1, a3 3280; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 3281; RV32IA-TSO-NEXT: srl a0, a1, a0 3282; RV32IA-TSO-NEXT: ret 3283; 3284; RV64I-LABEL: atomicrmw_and_i8_acq_rel: 3285; RV64I: # %bb.0: 3286; RV64I-NEXT: addi sp, sp, -16 3287; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3288; RV64I-NEXT: li a2, 4 3289; RV64I-NEXT: call __atomic_fetch_and_1 3290; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3291; RV64I-NEXT: addi sp, sp, 16 3292; RV64I-NEXT: ret 3293; 3294; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_acq_rel: 3295; RV64IA-WMO-NOZACAS: # %bb.0: 3296; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 3297; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 3298; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 3299; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 3300; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 3301; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 3302; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 3303; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 3304; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 3305; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 3306; RV64IA-WMO-NOZACAS-NEXT: ret 3307; 3308; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_acq_rel: 3309; RV64IA-TSO-NOZACAS: # %bb.0: 3310; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 3311; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 3312; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 3313; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 3314; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 3315; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 3316; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 3317; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 3318; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 3319; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 3320; RV64IA-TSO-NOZACAS-NEXT: ret 3321; 3322; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_acq_rel: 3323; RV64IA-WMO-ZACAS: # %bb.0: 3324; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 3325; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 3326; RV64IA-WMO-ZACAS-NEXT: li a3, 255 3327; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 3328; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 3329; RV64IA-WMO-ZACAS-NEXT: not a3, a3 3330; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 3331; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 3332; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 3333; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 3334; RV64IA-WMO-ZACAS-NEXT: ret 3335; 3336; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_acq_rel: 3337; RV64IA-TSO-ZACAS: # %bb.0: 3338; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 3339; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 3340; RV64IA-TSO-ZACAS-NEXT: li a3, 255 3341; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 3342; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 3343; RV64IA-TSO-ZACAS-NEXT: not a3, a3 3344; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 3345; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 3346; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 3347; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 3348; RV64IA-TSO-ZACAS-NEXT: ret 3349; 3350; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_acq_rel: 3351; RV64IA-WMO-ZABHA: # %bb.0: 3352; RV64IA-WMO-ZABHA-NEXT: amoand.b.aqrl a0, a1, (a0) 3353; RV64IA-WMO-ZABHA-NEXT: ret 3354; 3355; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_acq_rel: 3356; RV64IA-TSO-ZABHA: # %bb.0: 3357; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0) 3358; RV64IA-TSO-ZABHA-NEXT: ret 3359 %1 = atomicrmw and ptr %a, i8 %b acq_rel 3360 ret i8 %1 3361} 3362 3363define i8 @atomicrmw_and_i8_seq_cst(ptr %a, i8 %b) nounwind { 3364; RV32I-LABEL: atomicrmw_and_i8_seq_cst: 3365; RV32I: # %bb.0: 3366; RV32I-NEXT: addi sp, sp, -16 3367; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3368; RV32I-NEXT: li a2, 5 3369; RV32I-NEXT: call __atomic_fetch_and_1 3370; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3371; RV32I-NEXT: addi sp, sp, 16 3372; RV32I-NEXT: ret 3373; 3374; RV32IA-WMO-LABEL: atomicrmw_and_i8_seq_cst: 3375; RV32IA-WMO: # %bb.0: 3376; RV32IA-WMO-NEXT: andi a2, a0, -4 3377; RV32IA-WMO-NEXT: slli a0, a0, 3 3378; RV32IA-WMO-NEXT: li a3, 255 3379; RV32IA-WMO-NEXT: andi a1, a1, 255 3380; RV32IA-WMO-NEXT: sll a3, a3, a0 3381; RV32IA-WMO-NEXT: not a3, a3 3382; RV32IA-WMO-NEXT: sll a1, a1, a0 3383; RV32IA-WMO-NEXT: or a1, a1, a3 3384; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2) 3385; RV32IA-WMO-NEXT: srl a0, a1, a0 3386; RV32IA-WMO-NEXT: ret 3387; 3388; RV32IA-TSO-LABEL: atomicrmw_and_i8_seq_cst: 3389; RV32IA-TSO: # %bb.0: 3390; RV32IA-TSO-NEXT: andi a2, a0, -4 3391; RV32IA-TSO-NEXT: slli a0, a0, 3 3392; RV32IA-TSO-NEXT: li a3, 255 3393; RV32IA-TSO-NEXT: andi a1, a1, 255 3394; RV32IA-TSO-NEXT: sll a3, a3, a0 3395; RV32IA-TSO-NEXT: not a3, a3 3396; RV32IA-TSO-NEXT: sll a1, a1, a0 3397; RV32IA-TSO-NEXT: or a1, a1, a3 3398; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 3399; RV32IA-TSO-NEXT: srl a0, a1, a0 3400; RV32IA-TSO-NEXT: ret 3401; 3402; RV64I-LABEL: atomicrmw_and_i8_seq_cst: 3403; RV64I: # %bb.0: 3404; RV64I-NEXT: addi sp, sp, -16 3405; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3406; RV64I-NEXT: li a2, 5 3407; RV64I-NEXT: call __atomic_fetch_and_1 3408; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3409; RV64I-NEXT: addi sp, sp, 16 3410; RV64I-NEXT: ret 3411; 3412; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_seq_cst: 3413; RV64IA-WMO-NOZACAS: # %bb.0: 3414; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 3415; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 3416; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 3417; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 3418; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 3419; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 3420; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 3421; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 3422; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 3423; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 3424; RV64IA-WMO-NOZACAS-NEXT: ret 3425; 3426; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_seq_cst: 3427; RV64IA-TSO-NOZACAS: # %bb.0: 3428; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 3429; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 3430; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 3431; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 3432; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 3433; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 3434; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 3435; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 3436; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 3437; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 3438; RV64IA-TSO-NOZACAS-NEXT: ret 3439; 3440; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_seq_cst: 3441; RV64IA-WMO-ZACAS: # %bb.0: 3442; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 3443; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 3444; RV64IA-WMO-ZACAS-NEXT: li a3, 255 3445; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 3446; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 3447; RV64IA-WMO-ZACAS-NEXT: not a3, a3 3448; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 3449; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 3450; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 3451; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 3452; RV64IA-WMO-ZACAS-NEXT: ret 3453; 3454; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_seq_cst: 3455; RV64IA-TSO-ZACAS: # %bb.0: 3456; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 3457; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 3458; RV64IA-TSO-ZACAS-NEXT: li a3, 255 3459; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 3460; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 3461; RV64IA-TSO-ZACAS-NEXT: not a3, a3 3462; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 3463; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 3464; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 3465; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 3466; RV64IA-TSO-ZACAS-NEXT: ret 3467; 3468; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_seq_cst: 3469; RV64IA-WMO-ZABHA: # %bb.0: 3470; RV64IA-WMO-ZABHA-NEXT: amoand.b.aqrl a0, a1, (a0) 3471; RV64IA-WMO-ZABHA-NEXT: ret 3472; 3473; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_seq_cst: 3474; RV64IA-TSO-ZABHA: # %bb.0: 3475; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0) 3476; RV64IA-TSO-ZABHA-NEXT: ret 3477 %1 = atomicrmw and ptr %a, i8 %b seq_cst 3478 ret i8 %1 3479} 3480 3481define i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind { 3482; RV32I-LABEL: atomicrmw_nand_i8_monotonic: 3483; RV32I: # %bb.0: 3484; RV32I-NEXT: addi sp, sp, -16 3485; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3486; RV32I-NEXT: li a2, 0 3487; RV32I-NEXT: call __atomic_fetch_nand_1 3488; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3489; RV32I-NEXT: addi sp, sp, 16 3490; RV32I-NEXT: ret 3491; 3492; RV32IA-LABEL: atomicrmw_nand_i8_monotonic: 3493; RV32IA: # %bb.0: 3494; RV32IA-NEXT: andi a2, a0, -4 3495; RV32IA-NEXT: slli a0, a0, 3 3496; RV32IA-NEXT: li a3, 255 3497; RV32IA-NEXT: andi a1, a1, 255 3498; RV32IA-NEXT: sll a3, a3, a0 3499; RV32IA-NEXT: sll a1, a1, a0 3500; RV32IA-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1 3501; RV32IA-NEXT: lr.w a4, (a2) 3502; RV32IA-NEXT: and a5, a4, a1 3503; RV32IA-NEXT: not a5, a5 3504; RV32IA-NEXT: xor a5, a4, a5 3505; RV32IA-NEXT: and a5, a5, a3 3506; RV32IA-NEXT: xor a5, a4, a5 3507; RV32IA-NEXT: sc.w a5, a5, (a2) 3508; RV32IA-NEXT: bnez a5, .LBB30_1 3509; RV32IA-NEXT: # %bb.2: 3510; RV32IA-NEXT: srl a0, a4, a0 3511; RV32IA-NEXT: ret 3512; 3513; RV64I-LABEL: atomicrmw_nand_i8_monotonic: 3514; RV64I: # %bb.0: 3515; RV64I-NEXT: addi sp, sp, -16 3516; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3517; RV64I-NEXT: li a2, 0 3518; RV64I-NEXT: call __atomic_fetch_nand_1 3519; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3520; RV64I-NEXT: addi sp, sp, 16 3521; RV64I-NEXT: ret 3522; 3523; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic: 3524; RV64IA-NOZACAS: # %bb.0: 3525; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 3526; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 3527; RV64IA-NOZACAS-NEXT: li a3, 255 3528; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 3529; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 3530; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 3531; RV64IA-NOZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1 3532; RV64IA-NOZACAS-NEXT: lr.w a4, (a2) 3533; RV64IA-NOZACAS-NEXT: and a5, a4, a1 3534; RV64IA-NOZACAS-NEXT: not a5, a5 3535; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 3536; RV64IA-NOZACAS-NEXT: and a5, a5, a3 3537; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 3538; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 3539; RV64IA-NOZACAS-NEXT: bnez a5, .LBB30_1 3540; RV64IA-NOZACAS-NEXT: # %bb.2: 3541; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 3542; RV64IA-NOZACAS-NEXT: ret 3543; 3544; RV64IA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic: 3545; RV64IA-ZACAS: # %bb.0: 3546; RV64IA-ZACAS-NEXT: andi a2, a0, -4 3547; RV64IA-ZACAS-NEXT: slli a0, a0, 3 3548; RV64IA-ZACAS-NEXT: li a3, 255 3549; RV64IA-ZACAS-NEXT: andi a1, a1, 255 3550; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 3551; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 3552; RV64IA-ZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1 3553; RV64IA-ZACAS-NEXT: lr.w a4, (a2) 3554; RV64IA-ZACAS-NEXT: and a5, a4, a1 3555; RV64IA-ZACAS-NEXT: not a5, a5 3556; RV64IA-ZACAS-NEXT: xor a5, a4, a5 3557; RV64IA-ZACAS-NEXT: and a5, a5, a3 3558; RV64IA-ZACAS-NEXT: xor a5, a4, a5 3559; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 3560; RV64IA-ZACAS-NEXT: bnez a5, .LBB30_1 3561; RV64IA-ZACAS-NEXT: # %bb.2: 3562; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 3563; RV64IA-ZACAS-NEXT: ret 3564; 3565; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic: 3566; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 3567; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 3568; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 3569; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255 3570; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 3571; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 3572; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 3573; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1 3574; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2) 3575; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 3576; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 3577; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3578; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 3579; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3580; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 3581; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB30_1 3582; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 3583; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 3584; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 3585; 3586; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic: 3587; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 3588; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 3589; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 3590; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255 3591; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 3592; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 3593; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 3594; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1 3595; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2) 3596; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 3597; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 3598; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3599; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 3600; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3601; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 3602; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB30_1 3603; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 3604; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 3605; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 3606; 3607; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic: 3608; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 3609; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 3610; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 3611; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB30_1: # %atomicrmw.start 3612; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 3613; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 3614; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 3615; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 3616; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2) 3617; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 3618; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB30_1 3619; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 3620; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 3621; 3622; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic: 3623; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 3624; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 3625; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 3626; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB30_1: # %atomicrmw.start 3627; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 3628; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 3629; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 3630; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 3631; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2) 3632; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 3633; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB30_1 3634; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 3635; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 3636 %1 = atomicrmw nand ptr %a, i8 %b monotonic 3637 ret i8 %1 3638} 3639 3640define i8 @atomicrmw_nand_i8_acquire(ptr %a, i8 %b) nounwind { 3641; RV32I-LABEL: atomicrmw_nand_i8_acquire: 3642; RV32I: # %bb.0: 3643; RV32I-NEXT: addi sp, sp, -16 3644; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3645; RV32I-NEXT: li a2, 2 3646; RV32I-NEXT: call __atomic_fetch_nand_1 3647; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3648; RV32I-NEXT: addi sp, sp, 16 3649; RV32I-NEXT: ret 3650; 3651; RV32IA-WMO-LABEL: atomicrmw_nand_i8_acquire: 3652; RV32IA-WMO: # %bb.0: 3653; RV32IA-WMO-NEXT: andi a2, a0, -4 3654; RV32IA-WMO-NEXT: slli a0, a0, 3 3655; RV32IA-WMO-NEXT: li a3, 255 3656; RV32IA-WMO-NEXT: andi a1, a1, 255 3657; RV32IA-WMO-NEXT: sll a3, a3, a0 3658; RV32IA-WMO-NEXT: sll a1, a1, a0 3659; RV32IA-WMO-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3660; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 3661; RV32IA-WMO-NEXT: and a5, a4, a1 3662; RV32IA-WMO-NEXT: not a5, a5 3663; RV32IA-WMO-NEXT: xor a5, a4, a5 3664; RV32IA-WMO-NEXT: and a5, a5, a3 3665; RV32IA-WMO-NEXT: xor a5, a4, a5 3666; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 3667; RV32IA-WMO-NEXT: bnez a5, .LBB31_1 3668; RV32IA-WMO-NEXT: # %bb.2: 3669; RV32IA-WMO-NEXT: srl a0, a4, a0 3670; RV32IA-WMO-NEXT: ret 3671; 3672; RV32IA-TSO-LABEL: atomicrmw_nand_i8_acquire: 3673; RV32IA-TSO: # %bb.0: 3674; RV32IA-TSO-NEXT: andi a2, a0, -4 3675; RV32IA-TSO-NEXT: slli a0, a0, 3 3676; RV32IA-TSO-NEXT: li a3, 255 3677; RV32IA-TSO-NEXT: andi a1, a1, 255 3678; RV32IA-TSO-NEXT: sll a3, a3, a0 3679; RV32IA-TSO-NEXT: sll a1, a1, a0 3680; RV32IA-TSO-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3681; RV32IA-TSO-NEXT: lr.w a4, (a2) 3682; RV32IA-TSO-NEXT: and a5, a4, a1 3683; RV32IA-TSO-NEXT: not a5, a5 3684; RV32IA-TSO-NEXT: xor a5, a4, a5 3685; RV32IA-TSO-NEXT: and a5, a5, a3 3686; RV32IA-TSO-NEXT: xor a5, a4, a5 3687; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 3688; RV32IA-TSO-NEXT: bnez a5, .LBB31_1 3689; RV32IA-TSO-NEXT: # %bb.2: 3690; RV32IA-TSO-NEXT: srl a0, a4, a0 3691; RV32IA-TSO-NEXT: ret 3692; 3693; RV64I-LABEL: atomicrmw_nand_i8_acquire: 3694; RV64I: # %bb.0: 3695; RV64I-NEXT: addi sp, sp, -16 3696; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3697; RV64I-NEXT: li a2, 2 3698; RV64I-NEXT: call __atomic_fetch_nand_1 3699; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3700; RV64I-NEXT: addi sp, sp, 16 3701; RV64I-NEXT: ret 3702; 3703; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_acquire: 3704; RV64IA-WMO-NOZACAS: # %bb.0: 3705; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 3706; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 3707; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 3708; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 3709; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 3710; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 3711; RV64IA-WMO-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3712; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 3713; RV64IA-WMO-NOZACAS-NEXT: and a5, a4, a1 3714; RV64IA-WMO-NOZACAS-NEXT: not a5, a5 3715; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 3716; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 3717; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 3718; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 3719; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB31_1 3720; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 3721; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 3722; RV64IA-WMO-NOZACAS-NEXT: ret 3723; 3724; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_acquire: 3725; RV64IA-TSO-NOZACAS: # %bb.0: 3726; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 3727; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 3728; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 3729; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 3730; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 3731; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 3732; RV64IA-TSO-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3733; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 3734; RV64IA-TSO-NOZACAS-NEXT: and a5, a4, a1 3735; RV64IA-TSO-NOZACAS-NEXT: not a5, a5 3736; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 3737; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 3738; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 3739; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 3740; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB31_1 3741; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 3742; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 3743; RV64IA-TSO-NOZACAS-NEXT: ret 3744; 3745; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_acquire: 3746; RV64IA-WMO-ZACAS: # %bb.0: 3747; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 3748; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 3749; RV64IA-WMO-ZACAS-NEXT: li a3, 255 3750; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 3751; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 3752; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 3753; RV64IA-WMO-ZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3754; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 3755; RV64IA-WMO-ZACAS-NEXT: and a5, a4, a1 3756; RV64IA-WMO-ZACAS-NEXT: not a5, a5 3757; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 3758; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 3759; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 3760; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 3761; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB31_1 3762; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 3763; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 3764; RV64IA-WMO-ZACAS-NEXT: ret 3765; 3766; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_acquire: 3767; RV64IA-TSO-ZACAS: # %bb.0: 3768; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 3769; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 3770; RV64IA-TSO-ZACAS-NEXT: li a3, 255 3771; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 3772; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 3773; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 3774; RV64IA-TSO-ZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3775; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 3776; RV64IA-TSO-ZACAS-NEXT: and a5, a4, a1 3777; RV64IA-TSO-ZACAS-NEXT: not a5, a5 3778; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 3779; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 3780; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 3781; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 3782; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB31_1 3783; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 3784; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 3785; RV64IA-TSO-ZACAS-NEXT: ret 3786; 3787; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acquire: 3788; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 3789; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 3790; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 3791; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255 3792; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 3793; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 3794; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 3795; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3796; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a4, (a2) 3797; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 3798; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 3799; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3800; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 3801; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3802; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 3803; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB31_1 3804; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 3805; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 3806; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 3807; 3808; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acquire: 3809; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 3810; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 3811; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 3812; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255 3813; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 3814; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 3815; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 3816; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1 3817; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2) 3818; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 3819; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 3820; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3821; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 3822; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 3823; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 3824; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB31_1 3825; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 3826; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 3827; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 3828; 3829; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acquire: 3830; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 3831; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 3832; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 3833; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB31_1: # %atomicrmw.start 3834; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 3835; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 3836; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 3837; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 3838; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aq a0, a3, (a2) 3839; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 3840; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB31_1 3841; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 3842; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 3843; 3844; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acquire: 3845; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 3846; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 3847; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 3848; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB31_1: # %atomicrmw.start 3849; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 3850; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 3851; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 3852; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 3853; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2) 3854; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 3855; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB31_1 3856; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 3857; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 3858 %1 = atomicrmw nand ptr %a, i8 %b acquire 3859 ret i8 %1 3860} 3861 3862define i8 @atomicrmw_nand_i8_release(ptr %a, i8 %b) nounwind { 3863; RV32I-LABEL: atomicrmw_nand_i8_release: 3864; RV32I: # %bb.0: 3865; RV32I-NEXT: addi sp, sp, -16 3866; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3867; RV32I-NEXT: li a2, 3 3868; RV32I-NEXT: call __atomic_fetch_nand_1 3869; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 3870; RV32I-NEXT: addi sp, sp, 16 3871; RV32I-NEXT: ret 3872; 3873; RV32IA-WMO-LABEL: atomicrmw_nand_i8_release: 3874; RV32IA-WMO: # %bb.0: 3875; RV32IA-WMO-NEXT: andi a2, a0, -4 3876; RV32IA-WMO-NEXT: slli a0, a0, 3 3877; RV32IA-WMO-NEXT: li a3, 255 3878; RV32IA-WMO-NEXT: andi a1, a1, 255 3879; RV32IA-WMO-NEXT: sll a3, a3, a0 3880; RV32IA-WMO-NEXT: sll a1, a1, a0 3881; RV32IA-WMO-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 3882; RV32IA-WMO-NEXT: lr.w a4, (a2) 3883; RV32IA-WMO-NEXT: and a5, a4, a1 3884; RV32IA-WMO-NEXT: not a5, a5 3885; RV32IA-WMO-NEXT: xor a5, a4, a5 3886; RV32IA-WMO-NEXT: and a5, a5, a3 3887; RV32IA-WMO-NEXT: xor a5, a4, a5 3888; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 3889; RV32IA-WMO-NEXT: bnez a5, .LBB32_1 3890; RV32IA-WMO-NEXT: # %bb.2: 3891; RV32IA-WMO-NEXT: srl a0, a4, a0 3892; RV32IA-WMO-NEXT: ret 3893; 3894; RV32IA-TSO-LABEL: atomicrmw_nand_i8_release: 3895; RV32IA-TSO: # %bb.0: 3896; RV32IA-TSO-NEXT: andi a2, a0, -4 3897; RV32IA-TSO-NEXT: slli a0, a0, 3 3898; RV32IA-TSO-NEXT: li a3, 255 3899; RV32IA-TSO-NEXT: andi a1, a1, 255 3900; RV32IA-TSO-NEXT: sll a3, a3, a0 3901; RV32IA-TSO-NEXT: sll a1, a1, a0 3902; RV32IA-TSO-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 3903; RV32IA-TSO-NEXT: lr.w a4, (a2) 3904; RV32IA-TSO-NEXT: and a5, a4, a1 3905; RV32IA-TSO-NEXT: not a5, a5 3906; RV32IA-TSO-NEXT: xor a5, a4, a5 3907; RV32IA-TSO-NEXT: and a5, a5, a3 3908; RV32IA-TSO-NEXT: xor a5, a4, a5 3909; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 3910; RV32IA-TSO-NEXT: bnez a5, .LBB32_1 3911; RV32IA-TSO-NEXT: # %bb.2: 3912; RV32IA-TSO-NEXT: srl a0, a4, a0 3913; RV32IA-TSO-NEXT: ret 3914; 3915; RV64I-LABEL: atomicrmw_nand_i8_release: 3916; RV64I: # %bb.0: 3917; RV64I-NEXT: addi sp, sp, -16 3918; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 3919; RV64I-NEXT: li a2, 3 3920; RV64I-NEXT: call __atomic_fetch_nand_1 3921; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3922; RV64I-NEXT: addi sp, sp, 16 3923; RV64I-NEXT: ret 3924; 3925; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_release: 3926; RV64IA-WMO-NOZACAS: # %bb.0: 3927; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 3928; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 3929; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 3930; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 3931; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 3932; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 3933; RV64IA-WMO-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 3934; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2) 3935; RV64IA-WMO-NOZACAS-NEXT: and a5, a4, a1 3936; RV64IA-WMO-NOZACAS-NEXT: not a5, a5 3937; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 3938; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 3939; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 3940; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 3941; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB32_1 3942; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 3943; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 3944; RV64IA-WMO-NOZACAS-NEXT: ret 3945; 3946; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_release: 3947; RV64IA-TSO-NOZACAS: # %bb.0: 3948; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 3949; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 3950; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 3951; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 3952; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 3953; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 3954; RV64IA-TSO-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 3955; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 3956; RV64IA-TSO-NOZACAS-NEXT: and a5, a4, a1 3957; RV64IA-TSO-NOZACAS-NEXT: not a5, a5 3958; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 3959; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 3960; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 3961; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 3962; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB32_1 3963; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 3964; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 3965; RV64IA-TSO-NOZACAS-NEXT: ret 3966; 3967; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_release: 3968; RV64IA-WMO-ZACAS: # %bb.0: 3969; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 3970; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 3971; RV64IA-WMO-ZACAS-NEXT: li a3, 255 3972; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 3973; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 3974; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 3975; RV64IA-WMO-ZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 3976; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2) 3977; RV64IA-WMO-ZACAS-NEXT: and a5, a4, a1 3978; RV64IA-WMO-ZACAS-NEXT: not a5, a5 3979; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 3980; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 3981; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 3982; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 3983; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB32_1 3984; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 3985; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 3986; RV64IA-WMO-ZACAS-NEXT: ret 3987; 3988; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_release: 3989; RV64IA-TSO-ZACAS: # %bb.0: 3990; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 3991; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 3992; RV64IA-TSO-ZACAS-NEXT: li a3, 255 3993; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 3994; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 3995; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 3996; RV64IA-TSO-ZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 3997; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 3998; RV64IA-TSO-ZACAS-NEXT: and a5, a4, a1 3999; RV64IA-TSO-ZACAS-NEXT: not a5, a5 4000; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 4001; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 4002; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 4003; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 4004; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB32_1 4005; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 4006; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 4007; RV64IA-TSO-ZACAS-NEXT: ret 4008; 4009; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_release: 4010; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 4011; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 4012; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 4013; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255 4014; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 4015; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 4016; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 4017; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 4018; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2) 4019; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 4020; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 4021; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4022; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 4023; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4024; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 4025; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB32_1 4026; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 4027; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 4028; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 4029; 4030; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_release: 4031; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 4032; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 4033; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 4034; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255 4035; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 4036; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 4037; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 4038; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1 4039; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2) 4040; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 4041; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 4042; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4043; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 4044; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4045; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 4046; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB32_1 4047; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 4048; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 4049; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 4050; 4051; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_release: 4052; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 4053; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 4054; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 4055; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB32_1: # %atomicrmw.start 4056; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4057; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 4058; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 4059; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 4060; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.rl a0, a3, (a2) 4061; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 4062; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB32_1 4063; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 4064; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 4065; 4066; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_release: 4067; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 4068; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 4069; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 4070; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB32_1: # %atomicrmw.start 4071; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4072; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 4073; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 4074; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 4075; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2) 4076; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 4077; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB32_1 4078; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 4079; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 4080 %1 = atomicrmw nand ptr %a, i8 %b release 4081 ret i8 %1 4082} 4083 4084define i8 @atomicrmw_nand_i8_acq_rel(ptr %a, i8 %b) nounwind { 4085; RV32I-LABEL: atomicrmw_nand_i8_acq_rel: 4086; RV32I: # %bb.0: 4087; RV32I-NEXT: addi sp, sp, -16 4088; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4089; RV32I-NEXT: li a2, 4 4090; RV32I-NEXT: call __atomic_fetch_nand_1 4091; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4092; RV32I-NEXT: addi sp, sp, 16 4093; RV32I-NEXT: ret 4094; 4095; RV32IA-WMO-LABEL: atomicrmw_nand_i8_acq_rel: 4096; RV32IA-WMO: # %bb.0: 4097; RV32IA-WMO-NEXT: andi a2, a0, -4 4098; RV32IA-WMO-NEXT: slli a0, a0, 3 4099; RV32IA-WMO-NEXT: li a3, 255 4100; RV32IA-WMO-NEXT: andi a1, a1, 255 4101; RV32IA-WMO-NEXT: sll a3, a3, a0 4102; RV32IA-WMO-NEXT: sll a1, a1, a0 4103; RV32IA-WMO-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4104; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 4105; RV32IA-WMO-NEXT: and a5, a4, a1 4106; RV32IA-WMO-NEXT: not a5, a5 4107; RV32IA-WMO-NEXT: xor a5, a4, a5 4108; RV32IA-WMO-NEXT: and a5, a5, a3 4109; RV32IA-WMO-NEXT: xor a5, a4, a5 4110; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 4111; RV32IA-WMO-NEXT: bnez a5, .LBB33_1 4112; RV32IA-WMO-NEXT: # %bb.2: 4113; RV32IA-WMO-NEXT: srl a0, a4, a0 4114; RV32IA-WMO-NEXT: ret 4115; 4116; RV32IA-TSO-LABEL: atomicrmw_nand_i8_acq_rel: 4117; RV32IA-TSO: # %bb.0: 4118; RV32IA-TSO-NEXT: andi a2, a0, -4 4119; RV32IA-TSO-NEXT: slli a0, a0, 3 4120; RV32IA-TSO-NEXT: li a3, 255 4121; RV32IA-TSO-NEXT: andi a1, a1, 255 4122; RV32IA-TSO-NEXT: sll a3, a3, a0 4123; RV32IA-TSO-NEXT: sll a1, a1, a0 4124; RV32IA-TSO-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4125; RV32IA-TSO-NEXT: lr.w a4, (a2) 4126; RV32IA-TSO-NEXT: and a5, a4, a1 4127; RV32IA-TSO-NEXT: not a5, a5 4128; RV32IA-TSO-NEXT: xor a5, a4, a5 4129; RV32IA-TSO-NEXT: and a5, a5, a3 4130; RV32IA-TSO-NEXT: xor a5, a4, a5 4131; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 4132; RV32IA-TSO-NEXT: bnez a5, .LBB33_1 4133; RV32IA-TSO-NEXT: # %bb.2: 4134; RV32IA-TSO-NEXT: srl a0, a4, a0 4135; RV32IA-TSO-NEXT: ret 4136; 4137; RV64I-LABEL: atomicrmw_nand_i8_acq_rel: 4138; RV64I: # %bb.0: 4139; RV64I-NEXT: addi sp, sp, -16 4140; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4141; RV64I-NEXT: li a2, 4 4142; RV64I-NEXT: call __atomic_fetch_nand_1 4143; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4144; RV64I-NEXT: addi sp, sp, 16 4145; RV64I-NEXT: ret 4146; 4147; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4148; RV64IA-WMO-NOZACAS: # %bb.0: 4149; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 4150; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 4151; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 4152; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 4153; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 4154; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 4155; RV64IA-WMO-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4156; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 4157; RV64IA-WMO-NOZACAS-NEXT: and a5, a4, a1 4158; RV64IA-WMO-NOZACAS-NEXT: not a5, a5 4159; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 4160; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 4161; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 4162; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 4163; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB33_1 4164; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 4165; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 4166; RV64IA-WMO-NOZACAS-NEXT: ret 4167; 4168; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4169; RV64IA-TSO-NOZACAS: # %bb.0: 4170; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 4171; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 4172; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 4173; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 4174; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 4175; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 4176; RV64IA-TSO-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4177; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 4178; RV64IA-TSO-NOZACAS-NEXT: and a5, a4, a1 4179; RV64IA-TSO-NOZACAS-NEXT: not a5, a5 4180; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 4181; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 4182; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 4183; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 4184; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB33_1 4185; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 4186; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 4187; RV64IA-TSO-NOZACAS-NEXT: ret 4188; 4189; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4190; RV64IA-WMO-ZACAS: # %bb.0: 4191; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 4192; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 4193; RV64IA-WMO-ZACAS-NEXT: li a3, 255 4194; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 4195; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 4196; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 4197; RV64IA-WMO-ZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4198; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 4199; RV64IA-WMO-ZACAS-NEXT: and a5, a4, a1 4200; RV64IA-WMO-ZACAS-NEXT: not a5, a5 4201; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 4202; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 4203; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 4204; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 4205; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB33_1 4206; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 4207; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 4208; RV64IA-WMO-ZACAS-NEXT: ret 4209; 4210; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4211; RV64IA-TSO-ZACAS: # %bb.0: 4212; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 4213; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 4214; RV64IA-TSO-ZACAS-NEXT: li a3, 255 4215; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 4216; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 4217; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 4218; RV64IA-TSO-ZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4219; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 4220; RV64IA-TSO-ZACAS-NEXT: and a5, a4, a1 4221; RV64IA-TSO-ZACAS-NEXT: not a5, a5 4222; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 4223; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 4224; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 4225; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 4226; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB33_1 4227; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 4228; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 4229; RV64IA-TSO-ZACAS-NEXT: ret 4230; 4231; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4232; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 4233; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 4234; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 4235; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255 4236; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 4237; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 4238; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 4239; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4240; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a4, (a2) 4241; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 4242; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 4243; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4244; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 4245; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4246; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 4247; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB33_1 4248; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 4249; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 4250; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 4251; 4252; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4253; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 4254; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 4255; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 4256; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255 4257; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 4258; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 4259; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 4260; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1 4261; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2) 4262; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 4263; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 4264; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4265; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 4266; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4267; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 4268; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB33_1 4269; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 4270; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 4271; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 4272; 4273; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4274; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 4275; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 4276; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 4277; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB33_1: # %atomicrmw.start 4278; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4279; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 4280; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 4281; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 4282; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aqrl a0, a3, (a2) 4283; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 4284; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB33_1 4285; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 4286; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 4287; 4288; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel: 4289; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 4290; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 4291; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 4292; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB33_1: # %atomicrmw.start 4293; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4294; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 4295; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 4296; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 4297; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2) 4298; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 4299; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB33_1 4300; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 4301; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 4302 %1 = atomicrmw nand ptr %a, i8 %b acq_rel 4303 ret i8 %1 4304} 4305 4306define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind { 4307; RV32I-LABEL: atomicrmw_nand_i8_seq_cst: 4308; RV32I: # %bb.0: 4309; RV32I-NEXT: addi sp, sp, -16 4310; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4311; RV32I-NEXT: li a2, 5 4312; RV32I-NEXT: call __atomic_fetch_nand_1 4313; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4314; RV32I-NEXT: addi sp, sp, 16 4315; RV32I-NEXT: ret 4316; 4317; RV32IA-LABEL: atomicrmw_nand_i8_seq_cst: 4318; RV32IA: # %bb.0: 4319; RV32IA-NEXT: andi a2, a0, -4 4320; RV32IA-NEXT: slli a0, a0, 3 4321; RV32IA-NEXT: li a3, 255 4322; RV32IA-NEXT: andi a1, a1, 255 4323; RV32IA-NEXT: sll a3, a3, a0 4324; RV32IA-NEXT: sll a1, a1, a0 4325; RV32IA-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1 4326; RV32IA-NEXT: lr.w.aqrl a4, (a2) 4327; RV32IA-NEXT: and a5, a4, a1 4328; RV32IA-NEXT: not a5, a5 4329; RV32IA-NEXT: xor a5, a4, a5 4330; RV32IA-NEXT: and a5, a5, a3 4331; RV32IA-NEXT: xor a5, a4, a5 4332; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 4333; RV32IA-NEXT: bnez a5, .LBB34_1 4334; RV32IA-NEXT: # %bb.2: 4335; RV32IA-NEXT: srl a0, a4, a0 4336; RV32IA-NEXT: ret 4337; 4338; RV64I-LABEL: atomicrmw_nand_i8_seq_cst: 4339; RV64I: # %bb.0: 4340; RV64I-NEXT: addi sp, sp, -16 4341; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4342; RV64I-NEXT: li a2, 5 4343; RV64I-NEXT: call __atomic_fetch_nand_1 4344; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4345; RV64I-NEXT: addi sp, sp, 16 4346; RV64I-NEXT: ret 4347; 4348; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst: 4349; RV64IA-NOZACAS: # %bb.0: 4350; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 4351; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 4352; RV64IA-NOZACAS-NEXT: li a3, 255 4353; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 4354; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 4355; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 4356; RV64IA-NOZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1 4357; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 4358; RV64IA-NOZACAS-NEXT: and a5, a4, a1 4359; RV64IA-NOZACAS-NEXT: not a5, a5 4360; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 4361; RV64IA-NOZACAS-NEXT: and a5, a5, a3 4362; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 4363; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 4364; RV64IA-NOZACAS-NEXT: bnez a5, .LBB34_1 4365; RV64IA-NOZACAS-NEXT: # %bb.2: 4366; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 4367; RV64IA-NOZACAS-NEXT: ret 4368; 4369; RV64IA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst: 4370; RV64IA-ZACAS: # %bb.0: 4371; RV64IA-ZACAS-NEXT: andi a2, a0, -4 4372; RV64IA-ZACAS-NEXT: slli a0, a0, 3 4373; RV64IA-ZACAS-NEXT: li a3, 255 4374; RV64IA-ZACAS-NEXT: andi a1, a1, 255 4375; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 4376; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 4377; RV64IA-ZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1 4378; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2) 4379; RV64IA-ZACAS-NEXT: and a5, a4, a1 4380; RV64IA-ZACAS-NEXT: not a5, a5 4381; RV64IA-ZACAS-NEXT: xor a5, a4, a5 4382; RV64IA-ZACAS-NEXT: and a5, a5, a3 4383; RV64IA-ZACAS-NEXT: xor a5, a4, a5 4384; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 4385; RV64IA-ZACAS-NEXT: bnez a5, .LBB34_1 4386; RV64IA-ZACAS-NEXT: # %bb.2: 4387; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 4388; RV64IA-ZACAS-NEXT: ret 4389; 4390; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst: 4391; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 4392; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 4393; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 4394; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255 4395; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 4396; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 4397; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 4398; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1 4399; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 4400; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 4401; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 4402; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4403; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 4404; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4405; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 4406; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB34_1 4407; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 4408; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 4409; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 4410; 4411; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst: 4412; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 4413; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 4414; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 4415; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255 4416; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a1, a1, 255 4417; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0 4418; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 4419; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1 4420; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 4421; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1 4422; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 4423; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4424; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3 4425; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5 4426; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 4427; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB34_1 4428; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 4429; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0 4430; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 4431; 4432; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst: 4433; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 4434; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 4435; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 4436; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB34_1: # %atomicrmw.start 4437; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4438; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 4439; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw 4440; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 4441; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 4442; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aqrl a0, a3, (a2) 4443; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 4444; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB34_1 4445; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 4446; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 4447; 4448; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst: 4449; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 4450; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 4451; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0) 4452; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB34_1: # %atomicrmw.start 4453; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 4454; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 4455; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw 4456; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 4457; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56 4458; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2) 4459; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56 4460; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB34_1 4461; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 4462; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 4463 %1 = atomicrmw nand ptr %a, i8 %b seq_cst 4464 ret i8 %1 4465} 4466 4467define i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind { 4468; RV32I-LABEL: atomicrmw_or_i8_monotonic: 4469; RV32I: # %bb.0: 4470; RV32I-NEXT: addi sp, sp, -16 4471; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4472; RV32I-NEXT: li a2, 0 4473; RV32I-NEXT: call __atomic_fetch_or_1 4474; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4475; RV32I-NEXT: addi sp, sp, 16 4476; RV32I-NEXT: ret 4477; 4478; RV32IA-LABEL: atomicrmw_or_i8_monotonic: 4479; RV32IA: # %bb.0: 4480; RV32IA-NEXT: andi a2, a0, -4 4481; RV32IA-NEXT: slli a0, a0, 3 4482; RV32IA-NEXT: andi a1, a1, 255 4483; RV32IA-NEXT: sll a1, a1, a0 4484; RV32IA-NEXT: amoor.w a1, a1, (a2) 4485; RV32IA-NEXT: srl a0, a1, a0 4486; RV32IA-NEXT: ret 4487; 4488; RV64I-LABEL: atomicrmw_or_i8_monotonic: 4489; RV64I: # %bb.0: 4490; RV64I-NEXT: addi sp, sp, -16 4491; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4492; RV64I-NEXT: li a2, 0 4493; RV64I-NEXT: call __atomic_fetch_or_1 4494; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4495; RV64I-NEXT: addi sp, sp, 16 4496; RV64I-NEXT: ret 4497; 4498; RV64IA-NOZACAS-LABEL: atomicrmw_or_i8_monotonic: 4499; RV64IA-NOZACAS: # %bb.0: 4500; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 4501; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 4502; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 4503; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 4504; RV64IA-NOZACAS-NEXT: amoor.w a1, a1, (a2) 4505; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 4506; RV64IA-NOZACAS-NEXT: ret 4507; 4508; RV64IA-ZACAS-LABEL: atomicrmw_or_i8_monotonic: 4509; RV64IA-ZACAS: # %bb.0: 4510; RV64IA-ZACAS-NEXT: andi a2, a0, -4 4511; RV64IA-ZACAS-NEXT: slli a0, a0, 3 4512; RV64IA-ZACAS-NEXT: andi a1, a1, 255 4513; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 4514; RV64IA-ZACAS-NEXT: amoor.w a1, a1, (a2) 4515; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 4516; RV64IA-ZACAS-NEXT: ret 4517; 4518; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_monotonic: 4519; RV64IA-WMO-ZABHA: # %bb.0: 4520; RV64IA-WMO-ZABHA-NEXT: amoor.b a0, a1, (a0) 4521; RV64IA-WMO-ZABHA-NEXT: ret 4522; 4523; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_monotonic: 4524; RV64IA-TSO-ZABHA: # %bb.0: 4525; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0) 4526; RV64IA-TSO-ZABHA-NEXT: ret 4527 %1 = atomicrmw or ptr %a, i8 %b monotonic 4528 ret i8 %1 4529} 4530 4531define i8 @atomicrmw_or_i8_acquire(ptr %a, i8 %b) nounwind { 4532; RV32I-LABEL: atomicrmw_or_i8_acquire: 4533; RV32I: # %bb.0: 4534; RV32I-NEXT: addi sp, sp, -16 4535; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4536; RV32I-NEXT: li a2, 2 4537; RV32I-NEXT: call __atomic_fetch_or_1 4538; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4539; RV32I-NEXT: addi sp, sp, 16 4540; RV32I-NEXT: ret 4541; 4542; RV32IA-WMO-LABEL: atomicrmw_or_i8_acquire: 4543; RV32IA-WMO: # %bb.0: 4544; RV32IA-WMO-NEXT: andi a2, a0, -4 4545; RV32IA-WMO-NEXT: slli a0, a0, 3 4546; RV32IA-WMO-NEXT: andi a1, a1, 255 4547; RV32IA-WMO-NEXT: sll a1, a1, a0 4548; RV32IA-WMO-NEXT: amoor.w.aq a1, a1, (a2) 4549; RV32IA-WMO-NEXT: srl a0, a1, a0 4550; RV32IA-WMO-NEXT: ret 4551; 4552; RV32IA-TSO-LABEL: atomicrmw_or_i8_acquire: 4553; RV32IA-TSO: # %bb.0: 4554; RV32IA-TSO-NEXT: andi a2, a0, -4 4555; RV32IA-TSO-NEXT: slli a0, a0, 3 4556; RV32IA-TSO-NEXT: andi a1, a1, 255 4557; RV32IA-TSO-NEXT: sll a1, a1, a0 4558; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 4559; RV32IA-TSO-NEXT: srl a0, a1, a0 4560; RV32IA-TSO-NEXT: ret 4561; 4562; RV64I-LABEL: atomicrmw_or_i8_acquire: 4563; RV64I: # %bb.0: 4564; RV64I-NEXT: addi sp, sp, -16 4565; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4566; RV64I-NEXT: li a2, 2 4567; RV64I-NEXT: call __atomic_fetch_or_1 4568; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4569; RV64I-NEXT: addi sp, sp, 16 4570; RV64I-NEXT: ret 4571; 4572; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_acquire: 4573; RV64IA-WMO-NOZACAS: # %bb.0: 4574; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 4575; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 4576; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 4577; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 4578; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a1, (a2) 4579; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 4580; RV64IA-WMO-NOZACAS-NEXT: ret 4581; 4582; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_acquire: 4583; RV64IA-TSO-NOZACAS: # %bb.0: 4584; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 4585; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 4586; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 4587; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 4588; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 4589; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 4590; RV64IA-TSO-NOZACAS-NEXT: ret 4591; 4592; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_acquire: 4593; RV64IA-WMO-ZACAS: # %bb.0: 4594; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 4595; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 4596; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 4597; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 4598; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a1, (a2) 4599; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 4600; RV64IA-WMO-ZACAS-NEXT: ret 4601; 4602; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_acquire: 4603; RV64IA-TSO-ZACAS: # %bb.0: 4604; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 4605; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 4606; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 4607; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 4608; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 4609; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 4610; RV64IA-TSO-ZACAS-NEXT: ret 4611; 4612; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_acquire: 4613; RV64IA-WMO-ZABHA: # %bb.0: 4614; RV64IA-WMO-ZABHA-NEXT: amoor.b.aq a0, a1, (a0) 4615; RV64IA-WMO-ZABHA-NEXT: ret 4616; 4617; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_acquire: 4618; RV64IA-TSO-ZABHA: # %bb.0: 4619; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0) 4620; RV64IA-TSO-ZABHA-NEXT: ret 4621 %1 = atomicrmw or ptr %a, i8 %b acquire 4622 ret i8 %1 4623} 4624 4625define i8 @atomicrmw_or_i8_release(ptr %a, i8 %b) nounwind { 4626; RV32I-LABEL: atomicrmw_or_i8_release: 4627; RV32I: # %bb.0: 4628; RV32I-NEXT: addi sp, sp, -16 4629; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4630; RV32I-NEXT: li a2, 3 4631; RV32I-NEXT: call __atomic_fetch_or_1 4632; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4633; RV32I-NEXT: addi sp, sp, 16 4634; RV32I-NEXT: ret 4635; 4636; RV32IA-WMO-LABEL: atomicrmw_or_i8_release: 4637; RV32IA-WMO: # %bb.0: 4638; RV32IA-WMO-NEXT: andi a2, a0, -4 4639; RV32IA-WMO-NEXT: slli a0, a0, 3 4640; RV32IA-WMO-NEXT: andi a1, a1, 255 4641; RV32IA-WMO-NEXT: sll a1, a1, a0 4642; RV32IA-WMO-NEXT: amoor.w.rl a1, a1, (a2) 4643; RV32IA-WMO-NEXT: srl a0, a1, a0 4644; RV32IA-WMO-NEXT: ret 4645; 4646; RV32IA-TSO-LABEL: atomicrmw_or_i8_release: 4647; RV32IA-TSO: # %bb.0: 4648; RV32IA-TSO-NEXT: andi a2, a0, -4 4649; RV32IA-TSO-NEXT: slli a0, a0, 3 4650; RV32IA-TSO-NEXT: andi a1, a1, 255 4651; RV32IA-TSO-NEXT: sll a1, a1, a0 4652; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 4653; RV32IA-TSO-NEXT: srl a0, a1, a0 4654; RV32IA-TSO-NEXT: ret 4655; 4656; RV64I-LABEL: atomicrmw_or_i8_release: 4657; RV64I: # %bb.0: 4658; RV64I-NEXT: addi sp, sp, -16 4659; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4660; RV64I-NEXT: li a2, 3 4661; RV64I-NEXT: call __atomic_fetch_or_1 4662; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4663; RV64I-NEXT: addi sp, sp, 16 4664; RV64I-NEXT: ret 4665; 4666; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_release: 4667; RV64IA-WMO-NOZACAS: # %bb.0: 4668; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 4669; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 4670; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 4671; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 4672; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a1, (a2) 4673; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 4674; RV64IA-WMO-NOZACAS-NEXT: ret 4675; 4676; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_release: 4677; RV64IA-TSO-NOZACAS: # %bb.0: 4678; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 4679; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 4680; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 4681; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 4682; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 4683; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 4684; RV64IA-TSO-NOZACAS-NEXT: ret 4685; 4686; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_release: 4687; RV64IA-WMO-ZACAS: # %bb.0: 4688; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 4689; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 4690; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 4691; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 4692; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a1, (a2) 4693; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 4694; RV64IA-WMO-ZACAS-NEXT: ret 4695; 4696; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_release: 4697; RV64IA-TSO-ZACAS: # %bb.0: 4698; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 4699; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 4700; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 4701; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 4702; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 4703; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 4704; RV64IA-TSO-ZACAS-NEXT: ret 4705; 4706; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_release: 4707; RV64IA-WMO-ZABHA: # %bb.0: 4708; RV64IA-WMO-ZABHA-NEXT: amoor.b.rl a0, a1, (a0) 4709; RV64IA-WMO-ZABHA-NEXT: ret 4710; 4711; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_release: 4712; RV64IA-TSO-ZABHA: # %bb.0: 4713; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0) 4714; RV64IA-TSO-ZABHA-NEXT: ret 4715 %1 = atomicrmw or ptr %a, i8 %b release 4716 ret i8 %1 4717} 4718 4719define i8 @atomicrmw_or_i8_acq_rel(ptr %a, i8 %b) nounwind { 4720; RV32I-LABEL: atomicrmw_or_i8_acq_rel: 4721; RV32I: # %bb.0: 4722; RV32I-NEXT: addi sp, sp, -16 4723; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4724; RV32I-NEXT: li a2, 4 4725; RV32I-NEXT: call __atomic_fetch_or_1 4726; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4727; RV32I-NEXT: addi sp, sp, 16 4728; RV32I-NEXT: ret 4729; 4730; RV32IA-WMO-LABEL: atomicrmw_or_i8_acq_rel: 4731; RV32IA-WMO: # %bb.0: 4732; RV32IA-WMO-NEXT: andi a2, a0, -4 4733; RV32IA-WMO-NEXT: slli a0, a0, 3 4734; RV32IA-WMO-NEXT: andi a1, a1, 255 4735; RV32IA-WMO-NEXT: sll a1, a1, a0 4736; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2) 4737; RV32IA-WMO-NEXT: srl a0, a1, a0 4738; RV32IA-WMO-NEXT: ret 4739; 4740; RV32IA-TSO-LABEL: atomicrmw_or_i8_acq_rel: 4741; RV32IA-TSO: # %bb.0: 4742; RV32IA-TSO-NEXT: andi a2, a0, -4 4743; RV32IA-TSO-NEXT: slli a0, a0, 3 4744; RV32IA-TSO-NEXT: andi a1, a1, 255 4745; RV32IA-TSO-NEXT: sll a1, a1, a0 4746; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 4747; RV32IA-TSO-NEXT: srl a0, a1, a0 4748; RV32IA-TSO-NEXT: ret 4749; 4750; RV64I-LABEL: atomicrmw_or_i8_acq_rel: 4751; RV64I: # %bb.0: 4752; RV64I-NEXT: addi sp, sp, -16 4753; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4754; RV64I-NEXT: li a2, 4 4755; RV64I-NEXT: call __atomic_fetch_or_1 4756; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4757; RV64I-NEXT: addi sp, sp, 16 4758; RV64I-NEXT: ret 4759; 4760; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_acq_rel: 4761; RV64IA-WMO-NOZACAS: # %bb.0: 4762; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 4763; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 4764; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 4765; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 4766; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 4767; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 4768; RV64IA-WMO-NOZACAS-NEXT: ret 4769; 4770; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_acq_rel: 4771; RV64IA-TSO-NOZACAS: # %bb.0: 4772; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 4773; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 4774; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 4775; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 4776; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 4777; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 4778; RV64IA-TSO-NOZACAS-NEXT: ret 4779; 4780; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_acq_rel: 4781; RV64IA-WMO-ZACAS: # %bb.0: 4782; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 4783; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 4784; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 4785; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 4786; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 4787; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 4788; RV64IA-WMO-ZACAS-NEXT: ret 4789; 4790; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_acq_rel: 4791; RV64IA-TSO-ZACAS: # %bb.0: 4792; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 4793; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 4794; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 4795; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 4796; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 4797; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 4798; RV64IA-TSO-ZACAS-NEXT: ret 4799; 4800; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_acq_rel: 4801; RV64IA-WMO-ZABHA: # %bb.0: 4802; RV64IA-WMO-ZABHA-NEXT: amoor.b.aqrl a0, a1, (a0) 4803; RV64IA-WMO-ZABHA-NEXT: ret 4804; 4805; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_acq_rel: 4806; RV64IA-TSO-ZABHA: # %bb.0: 4807; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0) 4808; RV64IA-TSO-ZABHA-NEXT: ret 4809 %1 = atomicrmw or ptr %a, i8 %b acq_rel 4810 ret i8 %1 4811} 4812 4813define i8 @atomicrmw_or_i8_seq_cst(ptr %a, i8 %b) nounwind { 4814; RV32I-LABEL: atomicrmw_or_i8_seq_cst: 4815; RV32I: # %bb.0: 4816; RV32I-NEXT: addi sp, sp, -16 4817; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4818; RV32I-NEXT: li a2, 5 4819; RV32I-NEXT: call __atomic_fetch_or_1 4820; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4821; RV32I-NEXT: addi sp, sp, 16 4822; RV32I-NEXT: ret 4823; 4824; RV32IA-WMO-LABEL: atomicrmw_or_i8_seq_cst: 4825; RV32IA-WMO: # %bb.0: 4826; RV32IA-WMO-NEXT: andi a2, a0, -4 4827; RV32IA-WMO-NEXT: slli a0, a0, 3 4828; RV32IA-WMO-NEXT: andi a1, a1, 255 4829; RV32IA-WMO-NEXT: sll a1, a1, a0 4830; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2) 4831; RV32IA-WMO-NEXT: srl a0, a1, a0 4832; RV32IA-WMO-NEXT: ret 4833; 4834; RV32IA-TSO-LABEL: atomicrmw_or_i8_seq_cst: 4835; RV32IA-TSO: # %bb.0: 4836; RV32IA-TSO-NEXT: andi a2, a0, -4 4837; RV32IA-TSO-NEXT: slli a0, a0, 3 4838; RV32IA-TSO-NEXT: andi a1, a1, 255 4839; RV32IA-TSO-NEXT: sll a1, a1, a0 4840; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 4841; RV32IA-TSO-NEXT: srl a0, a1, a0 4842; RV32IA-TSO-NEXT: ret 4843; 4844; RV64I-LABEL: atomicrmw_or_i8_seq_cst: 4845; RV64I: # %bb.0: 4846; RV64I-NEXT: addi sp, sp, -16 4847; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4848; RV64I-NEXT: li a2, 5 4849; RV64I-NEXT: call __atomic_fetch_or_1 4850; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4851; RV64I-NEXT: addi sp, sp, 16 4852; RV64I-NEXT: ret 4853; 4854; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_seq_cst: 4855; RV64IA-WMO-NOZACAS: # %bb.0: 4856; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 4857; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 4858; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 4859; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 4860; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 4861; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 4862; RV64IA-WMO-NOZACAS-NEXT: ret 4863; 4864; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_seq_cst: 4865; RV64IA-TSO-NOZACAS: # %bb.0: 4866; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 4867; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 4868; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 4869; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 4870; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 4871; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 4872; RV64IA-TSO-NOZACAS-NEXT: ret 4873; 4874; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_seq_cst: 4875; RV64IA-WMO-ZACAS: # %bb.0: 4876; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 4877; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 4878; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 4879; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 4880; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 4881; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 4882; RV64IA-WMO-ZACAS-NEXT: ret 4883; 4884; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_seq_cst: 4885; RV64IA-TSO-ZACAS: # %bb.0: 4886; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 4887; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 4888; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 4889; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 4890; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 4891; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 4892; RV64IA-TSO-ZACAS-NEXT: ret 4893; 4894; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_seq_cst: 4895; RV64IA-WMO-ZABHA: # %bb.0: 4896; RV64IA-WMO-ZABHA-NEXT: amoor.b.aqrl a0, a1, (a0) 4897; RV64IA-WMO-ZABHA-NEXT: ret 4898; 4899; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_seq_cst: 4900; RV64IA-TSO-ZABHA: # %bb.0: 4901; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0) 4902; RV64IA-TSO-ZABHA-NEXT: ret 4903 %1 = atomicrmw or ptr %a, i8 %b seq_cst 4904 ret i8 %1 4905} 4906 4907define i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind { 4908; RV32I-LABEL: atomicrmw_xor_i8_monotonic: 4909; RV32I: # %bb.0: 4910; RV32I-NEXT: addi sp, sp, -16 4911; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4912; RV32I-NEXT: li a2, 0 4913; RV32I-NEXT: call __atomic_fetch_xor_1 4914; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4915; RV32I-NEXT: addi sp, sp, 16 4916; RV32I-NEXT: ret 4917; 4918; RV32IA-LABEL: atomicrmw_xor_i8_monotonic: 4919; RV32IA: # %bb.0: 4920; RV32IA-NEXT: andi a2, a0, -4 4921; RV32IA-NEXT: slli a0, a0, 3 4922; RV32IA-NEXT: andi a1, a1, 255 4923; RV32IA-NEXT: sll a1, a1, a0 4924; RV32IA-NEXT: amoxor.w a1, a1, (a2) 4925; RV32IA-NEXT: srl a0, a1, a0 4926; RV32IA-NEXT: ret 4927; 4928; RV64I-LABEL: atomicrmw_xor_i8_monotonic: 4929; RV64I: # %bb.0: 4930; RV64I-NEXT: addi sp, sp, -16 4931; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 4932; RV64I-NEXT: li a2, 0 4933; RV64I-NEXT: call __atomic_fetch_xor_1 4934; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 4935; RV64I-NEXT: addi sp, sp, 16 4936; RV64I-NEXT: ret 4937; 4938; RV64IA-NOZACAS-LABEL: atomicrmw_xor_i8_monotonic: 4939; RV64IA-NOZACAS: # %bb.0: 4940; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 4941; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 4942; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 4943; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 4944; RV64IA-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 4945; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 4946; RV64IA-NOZACAS-NEXT: ret 4947; 4948; RV64IA-ZACAS-LABEL: atomicrmw_xor_i8_monotonic: 4949; RV64IA-ZACAS: # %bb.0: 4950; RV64IA-ZACAS-NEXT: andi a2, a0, -4 4951; RV64IA-ZACAS-NEXT: slli a0, a0, 3 4952; RV64IA-ZACAS-NEXT: andi a1, a1, 255 4953; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 4954; RV64IA-ZACAS-NEXT: amoxor.w a1, a1, (a2) 4955; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 4956; RV64IA-ZACAS-NEXT: ret 4957; 4958; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_monotonic: 4959; RV64IA-WMO-ZABHA: # %bb.0: 4960; RV64IA-WMO-ZABHA-NEXT: amoxor.b a0, a1, (a0) 4961; RV64IA-WMO-ZABHA-NEXT: ret 4962; 4963; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_monotonic: 4964; RV64IA-TSO-ZABHA: # %bb.0: 4965; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0) 4966; RV64IA-TSO-ZABHA-NEXT: ret 4967 %1 = atomicrmw xor ptr %a, i8 %b monotonic 4968 ret i8 %1 4969} 4970 4971define i8 @atomicrmw_xor_i8_acquire(ptr %a, i8 %b) nounwind { 4972; RV32I-LABEL: atomicrmw_xor_i8_acquire: 4973; RV32I: # %bb.0: 4974; RV32I-NEXT: addi sp, sp, -16 4975; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 4976; RV32I-NEXT: li a2, 2 4977; RV32I-NEXT: call __atomic_fetch_xor_1 4978; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4979; RV32I-NEXT: addi sp, sp, 16 4980; RV32I-NEXT: ret 4981; 4982; RV32IA-WMO-LABEL: atomicrmw_xor_i8_acquire: 4983; RV32IA-WMO: # %bb.0: 4984; RV32IA-WMO-NEXT: andi a2, a0, -4 4985; RV32IA-WMO-NEXT: slli a0, a0, 3 4986; RV32IA-WMO-NEXT: andi a1, a1, 255 4987; RV32IA-WMO-NEXT: sll a1, a1, a0 4988; RV32IA-WMO-NEXT: amoxor.w.aq a1, a1, (a2) 4989; RV32IA-WMO-NEXT: srl a0, a1, a0 4990; RV32IA-WMO-NEXT: ret 4991; 4992; RV32IA-TSO-LABEL: atomicrmw_xor_i8_acquire: 4993; RV32IA-TSO: # %bb.0: 4994; RV32IA-TSO-NEXT: andi a2, a0, -4 4995; RV32IA-TSO-NEXT: slli a0, a0, 3 4996; RV32IA-TSO-NEXT: andi a1, a1, 255 4997; RV32IA-TSO-NEXT: sll a1, a1, a0 4998; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 4999; RV32IA-TSO-NEXT: srl a0, a1, a0 5000; RV32IA-TSO-NEXT: ret 5001; 5002; RV64I-LABEL: atomicrmw_xor_i8_acquire: 5003; RV64I: # %bb.0: 5004; RV64I-NEXT: addi sp, sp, -16 5005; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5006; RV64I-NEXT: li a2, 2 5007; RV64I-NEXT: call __atomic_fetch_xor_1 5008; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5009; RV64I-NEXT: addi sp, sp, 16 5010; RV64I-NEXT: ret 5011; 5012; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_acquire: 5013; RV64IA-WMO-NOZACAS: # %bb.0: 5014; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 5015; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 5016; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 5017; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 5018; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aq a1, a1, (a2) 5019; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 5020; RV64IA-WMO-NOZACAS-NEXT: ret 5021; 5022; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_acquire: 5023; RV64IA-TSO-NOZACAS: # %bb.0: 5024; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 5025; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 5026; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 5027; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 5028; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 5029; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 5030; RV64IA-TSO-NOZACAS-NEXT: ret 5031; 5032; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_acquire: 5033; RV64IA-WMO-ZACAS: # %bb.0: 5034; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 5035; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 5036; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 5037; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 5038; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aq a1, a1, (a2) 5039; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 5040; RV64IA-WMO-ZACAS-NEXT: ret 5041; 5042; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_acquire: 5043; RV64IA-TSO-ZACAS: # %bb.0: 5044; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 5045; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 5046; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 5047; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 5048; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 5049; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 5050; RV64IA-TSO-ZACAS-NEXT: ret 5051; 5052; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_acquire: 5053; RV64IA-WMO-ZABHA: # %bb.0: 5054; RV64IA-WMO-ZABHA-NEXT: amoxor.b.aq a0, a1, (a0) 5055; RV64IA-WMO-ZABHA-NEXT: ret 5056; 5057; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_acquire: 5058; RV64IA-TSO-ZABHA: # %bb.0: 5059; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0) 5060; RV64IA-TSO-ZABHA-NEXT: ret 5061 %1 = atomicrmw xor ptr %a, i8 %b acquire 5062 ret i8 %1 5063} 5064 5065define i8 @atomicrmw_xor_i8_release(ptr %a, i8 %b) nounwind { 5066; RV32I-LABEL: atomicrmw_xor_i8_release: 5067; RV32I: # %bb.0: 5068; RV32I-NEXT: addi sp, sp, -16 5069; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5070; RV32I-NEXT: li a2, 3 5071; RV32I-NEXT: call __atomic_fetch_xor_1 5072; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5073; RV32I-NEXT: addi sp, sp, 16 5074; RV32I-NEXT: ret 5075; 5076; RV32IA-WMO-LABEL: atomicrmw_xor_i8_release: 5077; RV32IA-WMO: # %bb.0: 5078; RV32IA-WMO-NEXT: andi a2, a0, -4 5079; RV32IA-WMO-NEXT: slli a0, a0, 3 5080; RV32IA-WMO-NEXT: andi a1, a1, 255 5081; RV32IA-WMO-NEXT: sll a1, a1, a0 5082; RV32IA-WMO-NEXT: amoxor.w.rl a1, a1, (a2) 5083; RV32IA-WMO-NEXT: srl a0, a1, a0 5084; RV32IA-WMO-NEXT: ret 5085; 5086; RV32IA-TSO-LABEL: atomicrmw_xor_i8_release: 5087; RV32IA-TSO: # %bb.0: 5088; RV32IA-TSO-NEXT: andi a2, a0, -4 5089; RV32IA-TSO-NEXT: slli a0, a0, 3 5090; RV32IA-TSO-NEXT: andi a1, a1, 255 5091; RV32IA-TSO-NEXT: sll a1, a1, a0 5092; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 5093; RV32IA-TSO-NEXT: srl a0, a1, a0 5094; RV32IA-TSO-NEXT: ret 5095; 5096; RV64I-LABEL: atomicrmw_xor_i8_release: 5097; RV64I: # %bb.0: 5098; RV64I-NEXT: addi sp, sp, -16 5099; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5100; RV64I-NEXT: li a2, 3 5101; RV64I-NEXT: call __atomic_fetch_xor_1 5102; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5103; RV64I-NEXT: addi sp, sp, 16 5104; RV64I-NEXT: ret 5105; 5106; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_release: 5107; RV64IA-WMO-NOZACAS: # %bb.0: 5108; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 5109; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 5110; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 5111; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 5112; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.rl a1, a1, (a2) 5113; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 5114; RV64IA-WMO-NOZACAS-NEXT: ret 5115; 5116; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_release: 5117; RV64IA-TSO-NOZACAS: # %bb.0: 5118; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 5119; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 5120; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 5121; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 5122; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 5123; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 5124; RV64IA-TSO-NOZACAS-NEXT: ret 5125; 5126; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_release: 5127; RV64IA-WMO-ZACAS: # %bb.0: 5128; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 5129; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 5130; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 5131; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 5132; RV64IA-WMO-ZACAS-NEXT: amoxor.w.rl a1, a1, (a2) 5133; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 5134; RV64IA-WMO-ZACAS-NEXT: ret 5135; 5136; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_release: 5137; RV64IA-TSO-ZACAS: # %bb.0: 5138; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 5139; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 5140; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 5141; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 5142; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 5143; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 5144; RV64IA-TSO-ZACAS-NEXT: ret 5145; 5146; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_release: 5147; RV64IA-WMO-ZABHA: # %bb.0: 5148; RV64IA-WMO-ZABHA-NEXT: amoxor.b.rl a0, a1, (a0) 5149; RV64IA-WMO-ZABHA-NEXT: ret 5150; 5151; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_release: 5152; RV64IA-TSO-ZABHA: # %bb.0: 5153; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0) 5154; RV64IA-TSO-ZABHA-NEXT: ret 5155 %1 = atomicrmw xor ptr %a, i8 %b release 5156 ret i8 %1 5157} 5158 5159define i8 @atomicrmw_xor_i8_acq_rel(ptr %a, i8 %b) nounwind { 5160; RV32I-LABEL: atomicrmw_xor_i8_acq_rel: 5161; RV32I: # %bb.0: 5162; RV32I-NEXT: addi sp, sp, -16 5163; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5164; RV32I-NEXT: li a2, 4 5165; RV32I-NEXT: call __atomic_fetch_xor_1 5166; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5167; RV32I-NEXT: addi sp, sp, 16 5168; RV32I-NEXT: ret 5169; 5170; RV32IA-WMO-LABEL: atomicrmw_xor_i8_acq_rel: 5171; RV32IA-WMO: # %bb.0: 5172; RV32IA-WMO-NEXT: andi a2, a0, -4 5173; RV32IA-WMO-NEXT: slli a0, a0, 3 5174; RV32IA-WMO-NEXT: andi a1, a1, 255 5175; RV32IA-WMO-NEXT: sll a1, a1, a0 5176; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2) 5177; RV32IA-WMO-NEXT: srl a0, a1, a0 5178; RV32IA-WMO-NEXT: ret 5179; 5180; RV32IA-TSO-LABEL: atomicrmw_xor_i8_acq_rel: 5181; RV32IA-TSO: # %bb.0: 5182; RV32IA-TSO-NEXT: andi a2, a0, -4 5183; RV32IA-TSO-NEXT: slli a0, a0, 3 5184; RV32IA-TSO-NEXT: andi a1, a1, 255 5185; RV32IA-TSO-NEXT: sll a1, a1, a0 5186; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 5187; RV32IA-TSO-NEXT: srl a0, a1, a0 5188; RV32IA-TSO-NEXT: ret 5189; 5190; RV64I-LABEL: atomicrmw_xor_i8_acq_rel: 5191; RV64I: # %bb.0: 5192; RV64I-NEXT: addi sp, sp, -16 5193; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5194; RV64I-NEXT: li a2, 4 5195; RV64I-NEXT: call __atomic_fetch_xor_1 5196; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5197; RV64I-NEXT: addi sp, sp, 16 5198; RV64I-NEXT: ret 5199; 5200; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_acq_rel: 5201; RV64IA-WMO-NOZACAS: # %bb.0: 5202; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 5203; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 5204; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 5205; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 5206; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 5207; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 5208; RV64IA-WMO-NOZACAS-NEXT: ret 5209; 5210; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_acq_rel: 5211; RV64IA-TSO-NOZACAS: # %bb.0: 5212; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 5213; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 5214; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 5215; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 5216; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 5217; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 5218; RV64IA-TSO-NOZACAS-NEXT: ret 5219; 5220; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_acq_rel: 5221; RV64IA-WMO-ZACAS: # %bb.0: 5222; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 5223; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 5224; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 5225; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 5226; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 5227; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 5228; RV64IA-WMO-ZACAS-NEXT: ret 5229; 5230; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_acq_rel: 5231; RV64IA-TSO-ZACAS: # %bb.0: 5232; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 5233; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 5234; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 5235; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 5236; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 5237; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 5238; RV64IA-TSO-ZACAS-NEXT: ret 5239; 5240; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_acq_rel: 5241; RV64IA-WMO-ZABHA: # %bb.0: 5242; RV64IA-WMO-ZABHA-NEXT: amoxor.b.aqrl a0, a1, (a0) 5243; RV64IA-WMO-ZABHA-NEXT: ret 5244; 5245; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_acq_rel: 5246; RV64IA-TSO-ZABHA: # %bb.0: 5247; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0) 5248; RV64IA-TSO-ZABHA-NEXT: ret 5249 %1 = atomicrmw xor ptr %a, i8 %b acq_rel 5250 ret i8 %1 5251} 5252 5253define i8 @atomicrmw_xor_i8_seq_cst(ptr %a, i8 %b) nounwind { 5254; RV32I-LABEL: atomicrmw_xor_i8_seq_cst: 5255; RV32I: # %bb.0: 5256; RV32I-NEXT: addi sp, sp, -16 5257; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 5258; RV32I-NEXT: li a2, 5 5259; RV32I-NEXT: call __atomic_fetch_xor_1 5260; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 5261; RV32I-NEXT: addi sp, sp, 16 5262; RV32I-NEXT: ret 5263; 5264; RV32IA-WMO-LABEL: atomicrmw_xor_i8_seq_cst: 5265; RV32IA-WMO: # %bb.0: 5266; RV32IA-WMO-NEXT: andi a2, a0, -4 5267; RV32IA-WMO-NEXT: slli a0, a0, 3 5268; RV32IA-WMO-NEXT: andi a1, a1, 255 5269; RV32IA-WMO-NEXT: sll a1, a1, a0 5270; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2) 5271; RV32IA-WMO-NEXT: srl a0, a1, a0 5272; RV32IA-WMO-NEXT: ret 5273; 5274; RV32IA-TSO-LABEL: atomicrmw_xor_i8_seq_cst: 5275; RV32IA-TSO: # %bb.0: 5276; RV32IA-TSO-NEXT: andi a2, a0, -4 5277; RV32IA-TSO-NEXT: slli a0, a0, 3 5278; RV32IA-TSO-NEXT: andi a1, a1, 255 5279; RV32IA-TSO-NEXT: sll a1, a1, a0 5280; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 5281; RV32IA-TSO-NEXT: srl a0, a1, a0 5282; RV32IA-TSO-NEXT: ret 5283; 5284; RV64I-LABEL: atomicrmw_xor_i8_seq_cst: 5285; RV64I: # %bb.0: 5286; RV64I-NEXT: addi sp, sp, -16 5287; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 5288; RV64I-NEXT: li a2, 5 5289; RV64I-NEXT: call __atomic_fetch_xor_1 5290; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5291; RV64I-NEXT: addi sp, sp, 16 5292; RV64I-NEXT: ret 5293; 5294; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_seq_cst: 5295; RV64IA-WMO-NOZACAS: # %bb.0: 5296; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 5297; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 5298; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 5299; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 5300; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 5301; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 5302; RV64IA-WMO-NOZACAS-NEXT: ret 5303; 5304; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_seq_cst: 5305; RV64IA-TSO-NOZACAS: # %bb.0: 5306; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 5307; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 5308; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 5309; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 5310; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 5311; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 5312; RV64IA-TSO-NOZACAS-NEXT: ret 5313; 5314; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_seq_cst: 5315; RV64IA-WMO-ZACAS: # %bb.0: 5316; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 5317; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 5318; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 5319; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 5320; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 5321; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 5322; RV64IA-WMO-ZACAS-NEXT: ret 5323; 5324; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_seq_cst: 5325; RV64IA-TSO-ZACAS: # %bb.0: 5326; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 5327; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 5328; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 5329; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 5330; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 5331; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 5332; RV64IA-TSO-ZACAS-NEXT: ret 5333; 5334; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_seq_cst: 5335; RV64IA-WMO-ZABHA: # %bb.0: 5336; RV64IA-WMO-ZABHA-NEXT: amoxor.b.aqrl a0, a1, (a0) 5337; RV64IA-WMO-ZABHA-NEXT: ret 5338; 5339; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_seq_cst: 5340; RV64IA-TSO-ZABHA: # %bb.0: 5341; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0) 5342; RV64IA-TSO-ZABHA-NEXT: ret 5343 %1 = atomicrmw xor ptr %a, i8 %b seq_cst 5344 ret i8 %1 5345} 5346 5347define i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind { 5348; RV32I-LABEL: atomicrmw_max_i8_monotonic: 5349; RV32I: # %bb.0: 5350; RV32I-NEXT: addi sp, sp, -32 5351; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 5352; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 5353; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 5354; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 5355; RV32I-NEXT: mv s0, a0 5356; RV32I-NEXT: lbu a3, 0(a0) 5357; RV32I-NEXT: mv s1, a1 5358; RV32I-NEXT: slli a0, a1, 24 5359; RV32I-NEXT: srai s2, a0, 24 5360; RV32I-NEXT: j .LBB45_2 5361; RV32I-NEXT: .LBB45_1: # %atomicrmw.start 5362; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 5363; RV32I-NEXT: sb a3, 15(sp) 5364; RV32I-NEXT: addi a1, sp, 15 5365; RV32I-NEXT: mv a0, s0 5366; RV32I-NEXT: li a3, 0 5367; RV32I-NEXT: li a4, 0 5368; RV32I-NEXT: call __atomic_compare_exchange_1 5369; RV32I-NEXT: lbu a3, 15(sp) 5370; RV32I-NEXT: bnez a0, .LBB45_4 5371; RV32I-NEXT: .LBB45_2: # %atomicrmw.start 5372; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 5373; RV32I-NEXT: slli a0, a3, 24 5374; RV32I-NEXT: srai a0, a0, 24 5375; RV32I-NEXT: mv a2, a3 5376; RV32I-NEXT: blt s2, a0, .LBB45_1 5377; RV32I-NEXT: # %bb.3: # %atomicrmw.start 5378; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1 5379; RV32I-NEXT: mv a2, s1 5380; RV32I-NEXT: j .LBB45_1 5381; RV32I-NEXT: .LBB45_4: # %atomicrmw.end 5382; RV32I-NEXT: mv a0, a3 5383; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 5384; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 5385; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 5386; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 5387; RV32I-NEXT: addi sp, sp, 32 5388; RV32I-NEXT: ret 5389; 5390; RV32IA-LABEL: atomicrmw_max_i8_monotonic: 5391; RV32IA: # %bb.0: 5392; RV32IA-NEXT: andi a2, a0, -4 5393; RV32IA-NEXT: slli a0, a0, 3 5394; RV32IA-NEXT: li a3, 255 5395; RV32IA-NEXT: slli a1, a1, 24 5396; RV32IA-NEXT: andi a4, a0, 24 5397; RV32IA-NEXT: sll a3, a3, a0 5398; RV32IA-NEXT: srai a1, a1, 24 5399; RV32IA-NEXT: sll a1, a1, a0 5400; RV32IA-NEXT: xori a4, a4, 24 5401; RV32IA-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 5402; RV32IA-NEXT: lr.w a5, (a2) 5403; RV32IA-NEXT: and a7, a5, a3 5404; RV32IA-NEXT: mv a6, a5 5405; RV32IA-NEXT: sll a7, a7, a4 5406; RV32IA-NEXT: sra a7, a7, a4 5407; RV32IA-NEXT: bge a7, a1, .LBB45_3 5408; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 5409; RV32IA-NEXT: xor a6, a5, a1 5410; RV32IA-NEXT: and a6, a6, a3 5411; RV32IA-NEXT: xor a6, a5, a6 5412; RV32IA-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 5413; RV32IA-NEXT: sc.w a6, a6, (a2) 5414; RV32IA-NEXT: bnez a6, .LBB45_1 5415; RV32IA-NEXT: # %bb.4: 5416; RV32IA-NEXT: srl a0, a5, a0 5417; RV32IA-NEXT: ret 5418; 5419; RV64I-LABEL: atomicrmw_max_i8_monotonic: 5420; RV64I: # %bb.0: 5421; RV64I-NEXT: addi sp, sp, -48 5422; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 5423; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 5424; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 5425; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 5426; RV64I-NEXT: mv s0, a0 5427; RV64I-NEXT: lbu a3, 0(a0) 5428; RV64I-NEXT: mv s1, a1 5429; RV64I-NEXT: slli a0, a1, 56 5430; RV64I-NEXT: srai s2, a0, 56 5431; RV64I-NEXT: j .LBB45_2 5432; RV64I-NEXT: .LBB45_1: # %atomicrmw.start 5433; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 5434; RV64I-NEXT: sb a3, 15(sp) 5435; RV64I-NEXT: addi a1, sp, 15 5436; RV64I-NEXT: mv a0, s0 5437; RV64I-NEXT: li a3, 0 5438; RV64I-NEXT: li a4, 0 5439; RV64I-NEXT: call __atomic_compare_exchange_1 5440; RV64I-NEXT: lbu a3, 15(sp) 5441; RV64I-NEXT: bnez a0, .LBB45_4 5442; RV64I-NEXT: .LBB45_2: # %atomicrmw.start 5443; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5444; RV64I-NEXT: slli a0, a3, 56 5445; RV64I-NEXT: srai a0, a0, 56 5446; RV64I-NEXT: mv a2, a3 5447; RV64I-NEXT: blt s2, a0, .LBB45_1 5448; RV64I-NEXT: # %bb.3: # %atomicrmw.start 5449; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1 5450; RV64I-NEXT: mv a2, s1 5451; RV64I-NEXT: j .LBB45_1 5452; RV64I-NEXT: .LBB45_4: # %atomicrmw.end 5453; RV64I-NEXT: mv a0, a3 5454; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 5455; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 5456; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 5457; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 5458; RV64I-NEXT: addi sp, sp, 48 5459; RV64I-NEXT: ret 5460; 5461; RV64IA-NOZACAS-LABEL: atomicrmw_max_i8_monotonic: 5462; RV64IA-NOZACAS: # %bb.0: 5463; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 5464; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 5465; RV64IA-NOZACAS-NEXT: li a3, 255 5466; RV64IA-NOZACAS-NEXT: slli a1, a1, 56 5467; RV64IA-NOZACAS-NEXT: andi a4, a0, 24 5468; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 5469; RV64IA-NOZACAS-NEXT: srai a1, a1, 56 5470; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 5471; RV64IA-NOZACAS-NEXT: xori a4, a4, 56 5472; RV64IA-NOZACAS-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 5473; RV64IA-NOZACAS-NEXT: lr.w a5, (a2) 5474; RV64IA-NOZACAS-NEXT: and a7, a5, a3 5475; RV64IA-NOZACAS-NEXT: mv a6, a5 5476; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 5477; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 5478; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB45_3 5479; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 5480; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 5481; RV64IA-NOZACAS-NEXT: and a6, a6, a3 5482; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 5483; RV64IA-NOZACAS-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 5484; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2) 5485; RV64IA-NOZACAS-NEXT: bnez a6, .LBB45_1 5486; RV64IA-NOZACAS-NEXT: # %bb.4: 5487; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 5488; RV64IA-NOZACAS-NEXT: ret 5489; 5490; RV64IA-ZACAS-LABEL: atomicrmw_max_i8_monotonic: 5491; RV64IA-ZACAS: # %bb.0: 5492; RV64IA-ZACAS-NEXT: andi a2, a0, -4 5493; RV64IA-ZACAS-NEXT: slli a0, a0, 3 5494; RV64IA-ZACAS-NEXT: li a3, 255 5495; RV64IA-ZACAS-NEXT: slli a1, a1, 56 5496; RV64IA-ZACAS-NEXT: andi a4, a0, 24 5497; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 5498; RV64IA-ZACAS-NEXT: srai a1, a1, 56 5499; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 5500; RV64IA-ZACAS-NEXT: xori a4, a4, 56 5501; RV64IA-ZACAS-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1 5502; RV64IA-ZACAS-NEXT: lr.w a5, (a2) 5503; RV64IA-ZACAS-NEXT: and a7, a5, a3 5504; RV64IA-ZACAS-NEXT: mv a6, a5 5505; RV64IA-ZACAS-NEXT: sll a7, a7, a4 5506; RV64IA-ZACAS-NEXT: sra a7, a7, a4 5507; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB45_3 5508; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1 5509; RV64IA-ZACAS-NEXT: xor a6, a5, a1 5510; RV64IA-ZACAS-NEXT: and a6, a6, a3 5511; RV64IA-ZACAS-NEXT: xor a6, a5, a6 5512; RV64IA-ZACAS-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1 5513; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2) 5514; RV64IA-ZACAS-NEXT: bnez a6, .LBB45_1 5515; RV64IA-ZACAS-NEXT: # %bb.4: 5516; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 5517; RV64IA-ZACAS-NEXT: ret 5518; 5519; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_monotonic: 5520; RV64IA-WMO-ZABHA: # %bb.0: 5521; RV64IA-WMO-ZABHA-NEXT: amomax.b a0, a1, (a0) 5522; RV64IA-WMO-ZABHA-NEXT: ret 5523; 5524; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_monotonic: 5525; RV64IA-TSO-ZABHA: # %bb.0: 5526; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0) 5527; RV64IA-TSO-ZABHA-NEXT: ret 5528 %1 = atomicrmw max ptr %a, i8 %b monotonic 5529 ret i8 %1 5530} 5531 5532define i8 @atomicrmw_max_i8_acquire(ptr %a, i8 %b) nounwind { 5533; RV32I-LABEL: atomicrmw_max_i8_acquire: 5534; RV32I: # %bb.0: 5535; RV32I-NEXT: addi sp, sp, -32 5536; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 5537; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 5538; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 5539; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 5540; RV32I-NEXT: mv s0, a0 5541; RV32I-NEXT: lbu a3, 0(a0) 5542; RV32I-NEXT: mv s1, a1 5543; RV32I-NEXT: slli a0, a1, 24 5544; RV32I-NEXT: srai s2, a0, 24 5545; RV32I-NEXT: j .LBB46_2 5546; RV32I-NEXT: .LBB46_1: # %atomicrmw.start 5547; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 5548; RV32I-NEXT: sb a3, 15(sp) 5549; RV32I-NEXT: addi a1, sp, 15 5550; RV32I-NEXT: li a3, 2 5551; RV32I-NEXT: li a4, 2 5552; RV32I-NEXT: mv a0, s0 5553; RV32I-NEXT: call __atomic_compare_exchange_1 5554; RV32I-NEXT: lbu a3, 15(sp) 5555; RV32I-NEXT: bnez a0, .LBB46_4 5556; RV32I-NEXT: .LBB46_2: # %atomicrmw.start 5557; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 5558; RV32I-NEXT: slli a0, a3, 24 5559; RV32I-NEXT: srai a0, a0, 24 5560; RV32I-NEXT: mv a2, a3 5561; RV32I-NEXT: blt s2, a0, .LBB46_1 5562; RV32I-NEXT: # %bb.3: # %atomicrmw.start 5563; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1 5564; RV32I-NEXT: mv a2, s1 5565; RV32I-NEXT: j .LBB46_1 5566; RV32I-NEXT: .LBB46_4: # %atomicrmw.end 5567; RV32I-NEXT: mv a0, a3 5568; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 5569; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 5570; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 5571; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 5572; RV32I-NEXT: addi sp, sp, 32 5573; RV32I-NEXT: ret 5574; 5575; RV32IA-WMO-LABEL: atomicrmw_max_i8_acquire: 5576; RV32IA-WMO: # %bb.0: 5577; RV32IA-WMO-NEXT: andi a2, a0, -4 5578; RV32IA-WMO-NEXT: slli a0, a0, 3 5579; RV32IA-WMO-NEXT: li a3, 255 5580; RV32IA-WMO-NEXT: slli a1, a1, 24 5581; RV32IA-WMO-NEXT: andi a4, a0, 24 5582; RV32IA-WMO-NEXT: sll a3, a3, a0 5583; RV32IA-WMO-NEXT: srai a1, a1, 24 5584; RV32IA-WMO-NEXT: sll a1, a1, a0 5585; RV32IA-WMO-NEXT: xori a4, a4, 24 5586; RV32IA-WMO-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 5587; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 5588; RV32IA-WMO-NEXT: and a7, a5, a3 5589; RV32IA-WMO-NEXT: mv a6, a5 5590; RV32IA-WMO-NEXT: sll a7, a7, a4 5591; RV32IA-WMO-NEXT: sra a7, a7, a4 5592; RV32IA-WMO-NEXT: bge a7, a1, .LBB46_3 5593; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 5594; RV32IA-WMO-NEXT: xor a6, a5, a1 5595; RV32IA-WMO-NEXT: and a6, a6, a3 5596; RV32IA-WMO-NEXT: xor a6, a5, a6 5597; RV32IA-WMO-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 5598; RV32IA-WMO-NEXT: sc.w a6, a6, (a2) 5599; RV32IA-WMO-NEXT: bnez a6, .LBB46_1 5600; RV32IA-WMO-NEXT: # %bb.4: 5601; RV32IA-WMO-NEXT: srl a0, a5, a0 5602; RV32IA-WMO-NEXT: ret 5603; 5604; RV32IA-TSO-LABEL: atomicrmw_max_i8_acquire: 5605; RV32IA-TSO: # %bb.0: 5606; RV32IA-TSO-NEXT: andi a2, a0, -4 5607; RV32IA-TSO-NEXT: slli a0, a0, 3 5608; RV32IA-TSO-NEXT: li a3, 255 5609; RV32IA-TSO-NEXT: slli a1, a1, 24 5610; RV32IA-TSO-NEXT: andi a4, a0, 24 5611; RV32IA-TSO-NEXT: sll a3, a3, a0 5612; RV32IA-TSO-NEXT: srai a1, a1, 24 5613; RV32IA-TSO-NEXT: sll a1, a1, a0 5614; RV32IA-TSO-NEXT: xori a4, a4, 24 5615; RV32IA-TSO-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 5616; RV32IA-TSO-NEXT: lr.w a5, (a2) 5617; RV32IA-TSO-NEXT: and a7, a5, a3 5618; RV32IA-TSO-NEXT: mv a6, a5 5619; RV32IA-TSO-NEXT: sll a7, a7, a4 5620; RV32IA-TSO-NEXT: sra a7, a7, a4 5621; RV32IA-TSO-NEXT: bge a7, a1, .LBB46_3 5622; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 5623; RV32IA-TSO-NEXT: xor a6, a5, a1 5624; RV32IA-TSO-NEXT: and a6, a6, a3 5625; RV32IA-TSO-NEXT: xor a6, a5, a6 5626; RV32IA-TSO-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 5627; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 5628; RV32IA-TSO-NEXT: bnez a6, .LBB46_1 5629; RV32IA-TSO-NEXT: # %bb.4: 5630; RV32IA-TSO-NEXT: srl a0, a5, a0 5631; RV32IA-TSO-NEXT: ret 5632; 5633; RV64I-LABEL: atomicrmw_max_i8_acquire: 5634; RV64I: # %bb.0: 5635; RV64I-NEXT: addi sp, sp, -48 5636; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 5637; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 5638; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 5639; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 5640; RV64I-NEXT: mv s0, a0 5641; RV64I-NEXT: lbu a3, 0(a0) 5642; RV64I-NEXT: mv s1, a1 5643; RV64I-NEXT: slli a0, a1, 56 5644; RV64I-NEXT: srai s2, a0, 56 5645; RV64I-NEXT: j .LBB46_2 5646; RV64I-NEXT: .LBB46_1: # %atomicrmw.start 5647; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 5648; RV64I-NEXT: sb a3, 15(sp) 5649; RV64I-NEXT: addi a1, sp, 15 5650; RV64I-NEXT: li a3, 2 5651; RV64I-NEXT: li a4, 2 5652; RV64I-NEXT: mv a0, s0 5653; RV64I-NEXT: call __atomic_compare_exchange_1 5654; RV64I-NEXT: lbu a3, 15(sp) 5655; RV64I-NEXT: bnez a0, .LBB46_4 5656; RV64I-NEXT: .LBB46_2: # %atomicrmw.start 5657; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5658; RV64I-NEXT: slli a0, a3, 56 5659; RV64I-NEXT: srai a0, a0, 56 5660; RV64I-NEXT: mv a2, a3 5661; RV64I-NEXT: blt s2, a0, .LBB46_1 5662; RV64I-NEXT: # %bb.3: # %atomicrmw.start 5663; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1 5664; RV64I-NEXT: mv a2, s1 5665; RV64I-NEXT: j .LBB46_1 5666; RV64I-NEXT: .LBB46_4: # %atomicrmw.end 5667; RV64I-NEXT: mv a0, a3 5668; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 5669; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 5670; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 5671; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 5672; RV64I-NEXT: addi sp, sp, 48 5673; RV64I-NEXT: ret 5674; 5675; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_acquire: 5676; RV64IA-WMO-NOZACAS: # %bb.0: 5677; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 5678; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 5679; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 5680; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56 5681; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24 5682; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 5683; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56 5684; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 5685; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56 5686; RV64IA-WMO-NOZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 5687; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 5688; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 5689; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 5690; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 5691; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 5692; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB46_3 5693; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 5694; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 5695; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 5696; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 5697; RV64IA-WMO-NOZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 5698; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2) 5699; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB46_1 5700; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 5701; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 5702; RV64IA-WMO-NOZACAS-NEXT: ret 5703; 5704; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_acquire: 5705; RV64IA-TSO-NOZACAS: # %bb.0: 5706; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 5707; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 5708; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 5709; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56 5710; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24 5711; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 5712; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56 5713; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 5714; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56 5715; RV64IA-TSO-NOZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 5716; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 5717; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 5718; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 5719; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 5720; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 5721; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB46_3 5722; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 5723; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 5724; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 5725; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 5726; RV64IA-TSO-NOZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 5727; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 5728; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB46_1 5729; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 5730; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 5731; RV64IA-TSO-NOZACAS-NEXT: ret 5732; 5733; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_acquire: 5734; RV64IA-WMO-ZACAS: # %bb.0: 5735; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 5736; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 5737; RV64IA-WMO-ZACAS-NEXT: li a3, 255 5738; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56 5739; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24 5740; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 5741; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56 5742; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 5743; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56 5744; RV64IA-WMO-ZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 5745; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 5746; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 5747; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 5748; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 5749; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 5750; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB46_3 5751; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 5752; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 5753; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 5754; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 5755; RV64IA-WMO-ZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 5756; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2) 5757; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB46_1 5758; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 5759; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 5760; RV64IA-WMO-ZACAS-NEXT: ret 5761; 5762; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_acquire: 5763; RV64IA-TSO-ZACAS: # %bb.0: 5764; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 5765; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 5766; RV64IA-TSO-ZACAS-NEXT: li a3, 255 5767; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56 5768; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24 5769; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 5770; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56 5771; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 5772; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56 5773; RV64IA-TSO-ZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1 5774; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 5775; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 5776; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 5777; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 5778; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 5779; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB46_3 5780; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1 5781; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 5782; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 5783; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 5784; RV64IA-TSO-ZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1 5785; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 5786; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB46_1 5787; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 5788; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 5789; RV64IA-TSO-ZACAS-NEXT: ret 5790; 5791; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_acquire: 5792; RV64IA-WMO-ZABHA: # %bb.0: 5793; RV64IA-WMO-ZABHA-NEXT: amomax.b.aq a0, a1, (a0) 5794; RV64IA-WMO-ZABHA-NEXT: ret 5795; 5796; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_acquire: 5797; RV64IA-TSO-ZABHA: # %bb.0: 5798; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0) 5799; RV64IA-TSO-ZABHA-NEXT: ret 5800 %1 = atomicrmw max ptr %a, i8 %b acquire 5801 ret i8 %1 5802} 5803 5804define i8 @atomicrmw_max_i8_release(ptr %a, i8 %b) nounwind { 5805; RV32I-LABEL: atomicrmw_max_i8_release: 5806; RV32I: # %bb.0: 5807; RV32I-NEXT: addi sp, sp, -32 5808; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 5809; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 5810; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 5811; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 5812; RV32I-NEXT: mv s0, a0 5813; RV32I-NEXT: lbu a3, 0(a0) 5814; RV32I-NEXT: mv s1, a1 5815; RV32I-NEXT: slli a0, a1, 24 5816; RV32I-NEXT: srai s2, a0, 24 5817; RV32I-NEXT: j .LBB47_2 5818; RV32I-NEXT: .LBB47_1: # %atomicrmw.start 5819; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1 5820; RV32I-NEXT: sb a3, 15(sp) 5821; RV32I-NEXT: addi a1, sp, 15 5822; RV32I-NEXT: li a3, 3 5823; RV32I-NEXT: mv a0, s0 5824; RV32I-NEXT: li a4, 0 5825; RV32I-NEXT: call __atomic_compare_exchange_1 5826; RV32I-NEXT: lbu a3, 15(sp) 5827; RV32I-NEXT: bnez a0, .LBB47_4 5828; RV32I-NEXT: .LBB47_2: # %atomicrmw.start 5829; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 5830; RV32I-NEXT: slli a0, a3, 24 5831; RV32I-NEXT: srai a0, a0, 24 5832; RV32I-NEXT: mv a2, a3 5833; RV32I-NEXT: blt s2, a0, .LBB47_1 5834; RV32I-NEXT: # %bb.3: # %atomicrmw.start 5835; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1 5836; RV32I-NEXT: mv a2, s1 5837; RV32I-NEXT: j .LBB47_1 5838; RV32I-NEXT: .LBB47_4: # %atomicrmw.end 5839; RV32I-NEXT: mv a0, a3 5840; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 5841; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 5842; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 5843; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 5844; RV32I-NEXT: addi sp, sp, 32 5845; RV32I-NEXT: ret 5846; 5847; RV32IA-WMO-LABEL: atomicrmw_max_i8_release: 5848; RV32IA-WMO: # %bb.0: 5849; RV32IA-WMO-NEXT: andi a2, a0, -4 5850; RV32IA-WMO-NEXT: slli a0, a0, 3 5851; RV32IA-WMO-NEXT: li a3, 255 5852; RV32IA-WMO-NEXT: slli a1, a1, 24 5853; RV32IA-WMO-NEXT: andi a4, a0, 24 5854; RV32IA-WMO-NEXT: sll a3, a3, a0 5855; RV32IA-WMO-NEXT: srai a1, a1, 24 5856; RV32IA-WMO-NEXT: sll a1, a1, a0 5857; RV32IA-WMO-NEXT: xori a4, a4, 24 5858; RV32IA-WMO-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 5859; RV32IA-WMO-NEXT: lr.w a5, (a2) 5860; RV32IA-WMO-NEXT: and a7, a5, a3 5861; RV32IA-WMO-NEXT: mv a6, a5 5862; RV32IA-WMO-NEXT: sll a7, a7, a4 5863; RV32IA-WMO-NEXT: sra a7, a7, a4 5864; RV32IA-WMO-NEXT: bge a7, a1, .LBB47_3 5865; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 5866; RV32IA-WMO-NEXT: xor a6, a5, a1 5867; RV32IA-WMO-NEXT: and a6, a6, a3 5868; RV32IA-WMO-NEXT: xor a6, a5, a6 5869; RV32IA-WMO-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 5870; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 5871; RV32IA-WMO-NEXT: bnez a6, .LBB47_1 5872; RV32IA-WMO-NEXT: # %bb.4: 5873; RV32IA-WMO-NEXT: srl a0, a5, a0 5874; RV32IA-WMO-NEXT: ret 5875; 5876; RV32IA-TSO-LABEL: atomicrmw_max_i8_release: 5877; RV32IA-TSO: # %bb.0: 5878; RV32IA-TSO-NEXT: andi a2, a0, -4 5879; RV32IA-TSO-NEXT: slli a0, a0, 3 5880; RV32IA-TSO-NEXT: li a3, 255 5881; RV32IA-TSO-NEXT: slli a1, a1, 24 5882; RV32IA-TSO-NEXT: andi a4, a0, 24 5883; RV32IA-TSO-NEXT: sll a3, a3, a0 5884; RV32IA-TSO-NEXT: srai a1, a1, 24 5885; RV32IA-TSO-NEXT: sll a1, a1, a0 5886; RV32IA-TSO-NEXT: xori a4, a4, 24 5887; RV32IA-TSO-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 5888; RV32IA-TSO-NEXT: lr.w a5, (a2) 5889; RV32IA-TSO-NEXT: and a7, a5, a3 5890; RV32IA-TSO-NEXT: mv a6, a5 5891; RV32IA-TSO-NEXT: sll a7, a7, a4 5892; RV32IA-TSO-NEXT: sra a7, a7, a4 5893; RV32IA-TSO-NEXT: bge a7, a1, .LBB47_3 5894; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 5895; RV32IA-TSO-NEXT: xor a6, a5, a1 5896; RV32IA-TSO-NEXT: and a6, a6, a3 5897; RV32IA-TSO-NEXT: xor a6, a5, a6 5898; RV32IA-TSO-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 5899; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 5900; RV32IA-TSO-NEXT: bnez a6, .LBB47_1 5901; RV32IA-TSO-NEXT: # %bb.4: 5902; RV32IA-TSO-NEXT: srl a0, a5, a0 5903; RV32IA-TSO-NEXT: ret 5904; 5905; RV64I-LABEL: atomicrmw_max_i8_release: 5906; RV64I: # %bb.0: 5907; RV64I-NEXT: addi sp, sp, -48 5908; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 5909; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 5910; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 5911; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 5912; RV64I-NEXT: mv s0, a0 5913; RV64I-NEXT: lbu a3, 0(a0) 5914; RV64I-NEXT: mv s1, a1 5915; RV64I-NEXT: slli a0, a1, 56 5916; RV64I-NEXT: srai s2, a0, 56 5917; RV64I-NEXT: j .LBB47_2 5918; RV64I-NEXT: .LBB47_1: # %atomicrmw.start 5919; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1 5920; RV64I-NEXT: sb a3, 15(sp) 5921; RV64I-NEXT: addi a1, sp, 15 5922; RV64I-NEXT: li a3, 3 5923; RV64I-NEXT: mv a0, s0 5924; RV64I-NEXT: li a4, 0 5925; RV64I-NEXT: call __atomic_compare_exchange_1 5926; RV64I-NEXT: lbu a3, 15(sp) 5927; RV64I-NEXT: bnez a0, .LBB47_4 5928; RV64I-NEXT: .LBB47_2: # %atomicrmw.start 5929; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 5930; RV64I-NEXT: slli a0, a3, 56 5931; RV64I-NEXT: srai a0, a0, 56 5932; RV64I-NEXT: mv a2, a3 5933; RV64I-NEXT: blt s2, a0, .LBB47_1 5934; RV64I-NEXT: # %bb.3: # %atomicrmw.start 5935; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1 5936; RV64I-NEXT: mv a2, s1 5937; RV64I-NEXT: j .LBB47_1 5938; RV64I-NEXT: .LBB47_4: # %atomicrmw.end 5939; RV64I-NEXT: mv a0, a3 5940; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 5941; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 5942; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 5943; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 5944; RV64I-NEXT: addi sp, sp, 48 5945; RV64I-NEXT: ret 5946; 5947; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_release: 5948; RV64IA-WMO-NOZACAS: # %bb.0: 5949; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 5950; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 5951; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 5952; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56 5953; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24 5954; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 5955; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56 5956; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 5957; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56 5958; RV64IA-WMO-NOZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 5959; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2) 5960; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 5961; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 5962; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 5963; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 5964; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB47_3 5965; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 5966; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 5967; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 5968; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 5969; RV64IA-WMO-NOZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 5970; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 5971; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB47_1 5972; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 5973; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 5974; RV64IA-WMO-NOZACAS-NEXT: ret 5975; 5976; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_release: 5977; RV64IA-TSO-NOZACAS: # %bb.0: 5978; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 5979; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 5980; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 5981; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56 5982; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24 5983; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 5984; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56 5985; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 5986; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56 5987; RV64IA-TSO-NOZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 5988; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 5989; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 5990; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 5991; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 5992; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 5993; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB47_3 5994; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 5995; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 5996; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 5997; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 5998; RV64IA-TSO-NOZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 5999; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 6000; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB47_1 6001; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 6002; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 6003; RV64IA-TSO-NOZACAS-NEXT: ret 6004; 6005; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_release: 6006; RV64IA-WMO-ZACAS: # %bb.0: 6007; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 6008; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 6009; RV64IA-WMO-ZACAS-NEXT: li a3, 255 6010; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56 6011; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24 6012; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 6013; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56 6014; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 6015; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56 6016; RV64IA-WMO-ZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 6017; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2) 6018; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 6019; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 6020; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 6021; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 6022; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB47_3 6023; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 6024; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 6025; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 6026; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 6027; RV64IA-WMO-ZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 6028; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 6029; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB47_1 6030; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 6031; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 6032; RV64IA-WMO-ZACAS-NEXT: ret 6033; 6034; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_release: 6035; RV64IA-TSO-ZACAS: # %bb.0: 6036; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 6037; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 6038; RV64IA-TSO-ZACAS-NEXT: li a3, 255 6039; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56 6040; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24 6041; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 6042; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56 6043; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 6044; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56 6045; RV64IA-TSO-ZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1 6046; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 6047; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 6048; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 6049; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 6050; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 6051; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB47_3 6052; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1 6053; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 6054; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 6055; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 6056; RV64IA-TSO-ZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1 6057; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 6058; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB47_1 6059; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 6060; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 6061; RV64IA-TSO-ZACAS-NEXT: ret 6062; 6063; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_release: 6064; RV64IA-WMO-ZABHA: # %bb.0: 6065; RV64IA-WMO-ZABHA-NEXT: amomax.b.rl a0, a1, (a0) 6066; RV64IA-WMO-ZABHA-NEXT: ret 6067; 6068; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_release: 6069; RV64IA-TSO-ZABHA: # %bb.0: 6070; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0) 6071; RV64IA-TSO-ZABHA-NEXT: ret 6072 %1 = atomicrmw max ptr %a, i8 %b release 6073 ret i8 %1 6074} 6075 6076define i8 @atomicrmw_max_i8_acq_rel(ptr %a, i8 %b) nounwind { 6077; RV32I-LABEL: atomicrmw_max_i8_acq_rel: 6078; RV32I: # %bb.0: 6079; RV32I-NEXT: addi sp, sp, -32 6080; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6081; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6082; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6083; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6084; RV32I-NEXT: mv s0, a0 6085; RV32I-NEXT: lbu a3, 0(a0) 6086; RV32I-NEXT: mv s1, a1 6087; RV32I-NEXT: slli a0, a1, 24 6088; RV32I-NEXT: srai s2, a0, 24 6089; RV32I-NEXT: j .LBB48_2 6090; RV32I-NEXT: .LBB48_1: # %atomicrmw.start 6091; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1 6092; RV32I-NEXT: sb a3, 15(sp) 6093; RV32I-NEXT: addi a1, sp, 15 6094; RV32I-NEXT: li a3, 4 6095; RV32I-NEXT: li a4, 2 6096; RV32I-NEXT: mv a0, s0 6097; RV32I-NEXT: call __atomic_compare_exchange_1 6098; RV32I-NEXT: lbu a3, 15(sp) 6099; RV32I-NEXT: bnez a0, .LBB48_4 6100; RV32I-NEXT: .LBB48_2: # %atomicrmw.start 6101; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 6102; RV32I-NEXT: slli a0, a3, 24 6103; RV32I-NEXT: srai a0, a0, 24 6104; RV32I-NEXT: mv a2, a3 6105; RV32I-NEXT: blt s2, a0, .LBB48_1 6106; RV32I-NEXT: # %bb.3: # %atomicrmw.start 6107; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1 6108; RV32I-NEXT: mv a2, s1 6109; RV32I-NEXT: j .LBB48_1 6110; RV32I-NEXT: .LBB48_4: # %atomicrmw.end 6111; RV32I-NEXT: mv a0, a3 6112; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6113; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6114; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6115; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6116; RV32I-NEXT: addi sp, sp, 32 6117; RV32I-NEXT: ret 6118; 6119; RV32IA-WMO-LABEL: atomicrmw_max_i8_acq_rel: 6120; RV32IA-WMO: # %bb.0: 6121; RV32IA-WMO-NEXT: andi a2, a0, -4 6122; RV32IA-WMO-NEXT: slli a0, a0, 3 6123; RV32IA-WMO-NEXT: li a3, 255 6124; RV32IA-WMO-NEXT: slli a1, a1, 24 6125; RV32IA-WMO-NEXT: andi a4, a0, 24 6126; RV32IA-WMO-NEXT: sll a3, a3, a0 6127; RV32IA-WMO-NEXT: srai a1, a1, 24 6128; RV32IA-WMO-NEXT: sll a1, a1, a0 6129; RV32IA-WMO-NEXT: xori a4, a4, 24 6130; RV32IA-WMO-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 6131; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 6132; RV32IA-WMO-NEXT: and a7, a5, a3 6133; RV32IA-WMO-NEXT: mv a6, a5 6134; RV32IA-WMO-NEXT: sll a7, a7, a4 6135; RV32IA-WMO-NEXT: sra a7, a7, a4 6136; RV32IA-WMO-NEXT: bge a7, a1, .LBB48_3 6137; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 6138; RV32IA-WMO-NEXT: xor a6, a5, a1 6139; RV32IA-WMO-NEXT: and a6, a6, a3 6140; RV32IA-WMO-NEXT: xor a6, a5, a6 6141; RV32IA-WMO-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 6142; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 6143; RV32IA-WMO-NEXT: bnez a6, .LBB48_1 6144; RV32IA-WMO-NEXT: # %bb.4: 6145; RV32IA-WMO-NEXT: srl a0, a5, a0 6146; RV32IA-WMO-NEXT: ret 6147; 6148; RV32IA-TSO-LABEL: atomicrmw_max_i8_acq_rel: 6149; RV32IA-TSO: # %bb.0: 6150; RV32IA-TSO-NEXT: andi a2, a0, -4 6151; RV32IA-TSO-NEXT: slli a0, a0, 3 6152; RV32IA-TSO-NEXT: li a3, 255 6153; RV32IA-TSO-NEXT: slli a1, a1, 24 6154; RV32IA-TSO-NEXT: andi a4, a0, 24 6155; RV32IA-TSO-NEXT: sll a3, a3, a0 6156; RV32IA-TSO-NEXT: srai a1, a1, 24 6157; RV32IA-TSO-NEXT: sll a1, a1, a0 6158; RV32IA-TSO-NEXT: xori a4, a4, 24 6159; RV32IA-TSO-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 6160; RV32IA-TSO-NEXT: lr.w a5, (a2) 6161; RV32IA-TSO-NEXT: and a7, a5, a3 6162; RV32IA-TSO-NEXT: mv a6, a5 6163; RV32IA-TSO-NEXT: sll a7, a7, a4 6164; RV32IA-TSO-NEXT: sra a7, a7, a4 6165; RV32IA-TSO-NEXT: bge a7, a1, .LBB48_3 6166; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 6167; RV32IA-TSO-NEXT: xor a6, a5, a1 6168; RV32IA-TSO-NEXT: and a6, a6, a3 6169; RV32IA-TSO-NEXT: xor a6, a5, a6 6170; RV32IA-TSO-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 6171; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 6172; RV32IA-TSO-NEXT: bnez a6, .LBB48_1 6173; RV32IA-TSO-NEXT: # %bb.4: 6174; RV32IA-TSO-NEXT: srl a0, a5, a0 6175; RV32IA-TSO-NEXT: ret 6176; 6177; RV64I-LABEL: atomicrmw_max_i8_acq_rel: 6178; RV64I: # %bb.0: 6179; RV64I-NEXT: addi sp, sp, -48 6180; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6181; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6182; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6183; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6184; RV64I-NEXT: mv s0, a0 6185; RV64I-NEXT: lbu a3, 0(a0) 6186; RV64I-NEXT: mv s1, a1 6187; RV64I-NEXT: slli a0, a1, 56 6188; RV64I-NEXT: srai s2, a0, 56 6189; RV64I-NEXT: j .LBB48_2 6190; RV64I-NEXT: .LBB48_1: # %atomicrmw.start 6191; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1 6192; RV64I-NEXT: sb a3, 15(sp) 6193; RV64I-NEXT: addi a1, sp, 15 6194; RV64I-NEXT: li a3, 4 6195; RV64I-NEXT: li a4, 2 6196; RV64I-NEXT: mv a0, s0 6197; RV64I-NEXT: call __atomic_compare_exchange_1 6198; RV64I-NEXT: lbu a3, 15(sp) 6199; RV64I-NEXT: bnez a0, .LBB48_4 6200; RV64I-NEXT: .LBB48_2: # %atomicrmw.start 6201; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6202; RV64I-NEXT: slli a0, a3, 56 6203; RV64I-NEXT: srai a0, a0, 56 6204; RV64I-NEXT: mv a2, a3 6205; RV64I-NEXT: blt s2, a0, .LBB48_1 6206; RV64I-NEXT: # %bb.3: # %atomicrmw.start 6207; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1 6208; RV64I-NEXT: mv a2, s1 6209; RV64I-NEXT: j .LBB48_1 6210; RV64I-NEXT: .LBB48_4: # %atomicrmw.end 6211; RV64I-NEXT: mv a0, a3 6212; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6213; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6214; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6215; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6216; RV64I-NEXT: addi sp, sp, 48 6217; RV64I-NEXT: ret 6218; 6219; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_acq_rel: 6220; RV64IA-WMO-NOZACAS: # %bb.0: 6221; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 6222; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 6223; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 6224; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56 6225; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24 6226; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 6227; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56 6228; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 6229; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56 6230; RV64IA-WMO-NOZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 6231; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 6232; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 6233; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 6234; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 6235; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 6236; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB48_3 6237; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 6238; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 6239; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 6240; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 6241; RV64IA-WMO-NOZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 6242; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 6243; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB48_1 6244; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 6245; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 6246; RV64IA-WMO-NOZACAS-NEXT: ret 6247; 6248; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_acq_rel: 6249; RV64IA-TSO-NOZACAS: # %bb.0: 6250; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 6251; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 6252; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 6253; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56 6254; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24 6255; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 6256; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56 6257; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 6258; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56 6259; RV64IA-TSO-NOZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 6260; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 6261; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 6262; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 6263; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 6264; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 6265; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB48_3 6266; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 6267; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 6268; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 6269; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 6270; RV64IA-TSO-NOZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 6271; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 6272; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB48_1 6273; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 6274; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 6275; RV64IA-TSO-NOZACAS-NEXT: ret 6276; 6277; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_acq_rel: 6278; RV64IA-WMO-ZACAS: # %bb.0: 6279; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 6280; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 6281; RV64IA-WMO-ZACAS-NEXT: li a3, 255 6282; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56 6283; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24 6284; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 6285; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56 6286; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 6287; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56 6288; RV64IA-WMO-ZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 6289; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 6290; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 6291; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 6292; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 6293; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 6294; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB48_3 6295; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 6296; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 6297; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 6298; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 6299; RV64IA-WMO-ZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 6300; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 6301; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB48_1 6302; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 6303; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 6304; RV64IA-WMO-ZACAS-NEXT: ret 6305; 6306; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_acq_rel: 6307; RV64IA-TSO-ZACAS: # %bb.0: 6308; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 6309; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 6310; RV64IA-TSO-ZACAS-NEXT: li a3, 255 6311; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56 6312; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24 6313; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 6314; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56 6315; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 6316; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56 6317; RV64IA-TSO-ZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1 6318; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 6319; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 6320; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 6321; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 6322; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 6323; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB48_3 6324; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1 6325; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 6326; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 6327; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 6328; RV64IA-TSO-ZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1 6329; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 6330; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB48_1 6331; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 6332; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 6333; RV64IA-TSO-ZACAS-NEXT: ret 6334; 6335; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_acq_rel: 6336; RV64IA-WMO-ZABHA: # %bb.0: 6337; RV64IA-WMO-ZABHA-NEXT: amomax.b.aqrl a0, a1, (a0) 6338; RV64IA-WMO-ZABHA-NEXT: ret 6339; 6340; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_acq_rel: 6341; RV64IA-TSO-ZABHA: # %bb.0: 6342; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0) 6343; RV64IA-TSO-ZABHA-NEXT: ret 6344 %1 = atomicrmw max ptr %a, i8 %b acq_rel 6345 ret i8 %1 6346} 6347 6348define i8 @atomicrmw_max_i8_seq_cst(ptr %a, i8 %b) nounwind { 6349; RV32I-LABEL: atomicrmw_max_i8_seq_cst: 6350; RV32I: # %bb.0: 6351; RV32I-NEXT: addi sp, sp, -32 6352; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6353; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6354; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6355; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6356; RV32I-NEXT: mv s0, a0 6357; RV32I-NEXT: lbu a3, 0(a0) 6358; RV32I-NEXT: mv s1, a1 6359; RV32I-NEXT: slli a0, a1, 24 6360; RV32I-NEXT: srai s2, a0, 24 6361; RV32I-NEXT: j .LBB49_2 6362; RV32I-NEXT: .LBB49_1: # %atomicrmw.start 6363; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1 6364; RV32I-NEXT: sb a3, 15(sp) 6365; RV32I-NEXT: addi a1, sp, 15 6366; RV32I-NEXT: li a3, 5 6367; RV32I-NEXT: li a4, 5 6368; RV32I-NEXT: mv a0, s0 6369; RV32I-NEXT: call __atomic_compare_exchange_1 6370; RV32I-NEXT: lbu a3, 15(sp) 6371; RV32I-NEXT: bnez a0, .LBB49_4 6372; RV32I-NEXT: .LBB49_2: # %atomicrmw.start 6373; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 6374; RV32I-NEXT: slli a0, a3, 24 6375; RV32I-NEXT: srai a0, a0, 24 6376; RV32I-NEXT: mv a2, a3 6377; RV32I-NEXT: blt s2, a0, .LBB49_1 6378; RV32I-NEXT: # %bb.3: # %atomicrmw.start 6379; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1 6380; RV32I-NEXT: mv a2, s1 6381; RV32I-NEXT: j .LBB49_1 6382; RV32I-NEXT: .LBB49_4: # %atomicrmw.end 6383; RV32I-NEXT: mv a0, a3 6384; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6385; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6386; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6387; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6388; RV32I-NEXT: addi sp, sp, 32 6389; RV32I-NEXT: ret 6390; 6391; RV32IA-LABEL: atomicrmw_max_i8_seq_cst: 6392; RV32IA: # %bb.0: 6393; RV32IA-NEXT: andi a2, a0, -4 6394; RV32IA-NEXT: slli a0, a0, 3 6395; RV32IA-NEXT: li a3, 255 6396; RV32IA-NEXT: slli a1, a1, 24 6397; RV32IA-NEXT: andi a4, a0, 24 6398; RV32IA-NEXT: sll a3, a3, a0 6399; RV32IA-NEXT: srai a1, a1, 24 6400; RV32IA-NEXT: sll a1, a1, a0 6401; RV32IA-NEXT: xori a4, a4, 24 6402; RV32IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 6403; RV32IA-NEXT: lr.w.aqrl a5, (a2) 6404; RV32IA-NEXT: and a7, a5, a3 6405; RV32IA-NEXT: mv a6, a5 6406; RV32IA-NEXT: sll a7, a7, a4 6407; RV32IA-NEXT: sra a7, a7, a4 6408; RV32IA-NEXT: bge a7, a1, .LBB49_3 6409; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 6410; RV32IA-NEXT: xor a6, a5, a1 6411; RV32IA-NEXT: and a6, a6, a3 6412; RV32IA-NEXT: xor a6, a5, a6 6413; RV32IA-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 6414; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 6415; RV32IA-NEXT: bnez a6, .LBB49_1 6416; RV32IA-NEXT: # %bb.4: 6417; RV32IA-NEXT: srl a0, a5, a0 6418; RV32IA-NEXT: ret 6419; 6420; RV64I-LABEL: atomicrmw_max_i8_seq_cst: 6421; RV64I: # %bb.0: 6422; RV64I-NEXT: addi sp, sp, -48 6423; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6424; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6425; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6426; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6427; RV64I-NEXT: mv s0, a0 6428; RV64I-NEXT: lbu a3, 0(a0) 6429; RV64I-NEXT: mv s1, a1 6430; RV64I-NEXT: slli a0, a1, 56 6431; RV64I-NEXT: srai s2, a0, 56 6432; RV64I-NEXT: j .LBB49_2 6433; RV64I-NEXT: .LBB49_1: # %atomicrmw.start 6434; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1 6435; RV64I-NEXT: sb a3, 15(sp) 6436; RV64I-NEXT: addi a1, sp, 15 6437; RV64I-NEXT: li a3, 5 6438; RV64I-NEXT: li a4, 5 6439; RV64I-NEXT: mv a0, s0 6440; RV64I-NEXT: call __atomic_compare_exchange_1 6441; RV64I-NEXT: lbu a3, 15(sp) 6442; RV64I-NEXT: bnez a0, .LBB49_4 6443; RV64I-NEXT: .LBB49_2: # %atomicrmw.start 6444; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6445; RV64I-NEXT: slli a0, a3, 56 6446; RV64I-NEXT: srai a0, a0, 56 6447; RV64I-NEXT: mv a2, a3 6448; RV64I-NEXT: blt s2, a0, .LBB49_1 6449; RV64I-NEXT: # %bb.3: # %atomicrmw.start 6450; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1 6451; RV64I-NEXT: mv a2, s1 6452; RV64I-NEXT: j .LBB49_1 6453; RV64I-NEXT: .LBB49_4: # %atomicrmw.end 6454; RV64I-NEXT: mv a0, a3 6455; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6456; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6457; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6458; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6459; RV64I-NEXT: addi sp, sp, 48 6460; RV64I-NEXT: ret 6461; 6462; RV64IA-NOZACAS-LABEL: atomicrmw_max_i8_seq_cst: 6463; RV64IA-NOZACAS: # %bb.0: 6464; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 6465; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 6466; RV64IA-NOZACAS-NEXT: li a3, 255 6467; RV64IA-NOZACAS-NEXT: slli a1, a1, 56 6468; RV64IA-NOZACAS-NEXT: andi a4, a0, 24 6469; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 6470; RV64IA-NOZACAS-NEXT: srai a1, a1, 56 6471; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 6472; RV64IA-NOZACAS-NEXT: xori a4, a4, 56 6473; RV64IA-NOZACAS-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 6474; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2) 6475; RV64IA-NOZACAS-NEXT: and a7, a5, a3 6476; RV64IA-NOZACAS-NEXT: mv a6, a5 6477; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 6478; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 6479; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB49_3 6480; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 6481; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 6482; RV64IA-NOZACAS-NEXT: and a6, a6, a3 6483; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 6484; RV64IA-NOZACAS-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 6485; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 6486; RV64IA-NOZACAS-NEXT: bnez a6, .LBB49_1 6487; RV64IA-NOZACAS-NEXT: # %bb.4: 6488; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 6489; RV64IA-NOZACAS-NEXT: ret 6490; 6491; RV64IA-ZACAS-LABEL: atomicrmw_max_i8_seq_cst: 6492; RV64IA-ZACAS: # %bb.0: 6493; RV64IA-ZACAS-NEXT: andi a2, a0, -4 6494; RV64IA-ZACAS-NEXT: slli a0, a0, 3 6495; RV64IA-ZACAS-NEXT: li a3, 255 6496; RV64IA-ZACAS-NEXT: slli a1, a1, 56 6497; RV64IA-ZACAS-NEXT: andi a4, a0, 24 6498; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 6499; RV64IA-ZACAS-NEXT: srai a1, a1, 56 6500; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 6501; RV64IA-ZACAS-NEXT: xori a4, a4, 56 6502; RV64IA-ZACAS-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1 6503; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2) 6504; RV64IA-ZACAS-NEXT: and a7, a5, a3 6505; RV64IA-ZACAS-NEXT: mv a6, a5 6506; RV64IA-ZACAS-NEXT: sll a7, a7, a4 6507; RV64IA-ZACAS-NEXT: sra a7, a7, a4 6508; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB49_3 6509; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1 6510; RV64IA-ZACAS-NEXT: xor a6, a5, a1 6511; RV64IA-ZACAS-NEXT: and a6, a6, a3 6512; RV64IA-ZACAS-NEXT: xor a6, a5, a6 6513; RV64IA-ZACAS-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1 6514; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 6515; RV64IA-ZACAS-NEXT: bnez a6, .LBB49_1 6516; RV64IA-ZACAS-NEXT: # %bb.4: 6517; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 6518; RV64IA-ZACAS-NEXT: ret 6519; 6520; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_seq_cst: 6521; RV64IA-WMO-ZABHA: # %bb.0: 6522; RV64IA-WMO-ZABHA-NEXT: amomax.b.aqrl a0, a1, (a0) 6523; RV64IA-WMO-ZABHA-NEXT: ret 6524; 6525; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_seq_cst: 6526; RV64IA-TSO-ZABHA: # %bb.0: 6527; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0) 6528; RV64IA-TSO-ZABHA-NEXT: ret 6529 %1 = atomicrmw max ptr %a, i8 %b seq_cst 6530 ret i8 %1 6531} 6532 6533define i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind { 6534; RV32I-LABEL: atomicrmw_min_i8_monotonic: 6535; RV32I: # %bb.0: 6536; RV32I-NEXT: addi sp, sp, -32 6537; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6538; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6539; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6540; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6541; RV32I-NEXT: mv s0, a0 6542; RV32I-NEXT: lbu a3, 0(a0) 6543; RV32I-NEXT: mv s1, a1 6544; RV32I-NEXT: slli a0, a1, 24 6545; RV32I-NEXT: srai s2, a0, 24 6546; RV32I-NEXT: j .LBB50_2 6547; RV32I-NEXT: .LBB50_1: # %atomicrmw.start 6548; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1 6549; RV32I-NEXT: sb a3, 15(sp) 6550; RV32I-NEXT: addi a1, sp, 15 6551; RV32I-NEXT: mv a0, s0 6552; RV32I-NEXT: li a3, 0 6553; RV32I-NEXT: li a4, 0 6554; RV32I-NEXT: call __atomic_compare_exchange_1 6555; RV32I-NEXT: lbu a3, 15(sp) 6556; RV32I-NEXT: bnez a0, .LBB50_4 6557; RV32I-NEXT: .LBB50_2: # %atomicrmw.start 6558; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 6559; RV32I-NEXT: slli a0, a3, 24 6560; RV32I-NEXT: srai a0, a0, 24 6561; RV32I-NEXT: mv a2, a3 6562; RV32I-NEXT: bge s2, a0, .LBB50_1 6563; RV32I-NEXT: # %bb.3: # %atomicrmw.start 6564; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1 6565; RV32I-NEXT: mv a2, s1 6566; RV32I-NEXT: j .LBB50_1 6567; RV32I-NEXT: .LBB50_4: # %atomicrmw.end 6568; RV32I-NEXT: mv a0, a3 6569; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6570; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6571; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6572; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6573; RV32I-NEXT: addi sp, sp, 32 6574; RV32I-NEXT: ret 6575; 6576; RV32IA-LABEL: atomicrmw_min_i8_monotonic: 6577; RV32IA: # %bb.0: 6578; RV32IA-NEXT: andi a2, a0, -4 6579; RV32IA-NEXT: slli a0, a0, 3 6580; RV32IA-NEXT: li a3, 255 6581; RV32IA-NEXT: slli a1, a1, 24 6582; RV32IA-NEXT: andi a4, a0, 24 6583; RV32IA-NEXT: sll a3, a3, a0 6584; RV32IA-NEXT: srai a1, a1, 24 6585; RV32IA-NEXT: sll a1, a1, a0 6586; RV32IA-NEXT: xori a4, a4, 24 6587; RV32IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 6588; RV32IA-NEXT: lr.w a5, (a2) 6589; RV32IA-NEXT: and a7, a5, a3 6590; RV32IA-NEXT: mv a6, a5 6591; RV32IA-NEXT: sll a7, a7, a4 6592; RV32IA-NEXT: sra a7, a7, a4 6593; RV32IA-NEXT: bge a1, a7, .LBB50_3 6594; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 6595; RV32IA-NEXT: xor a6, a5, a1 6596; RV32IA-NEXT: and a6, a6, a3 6597; RV32IA-NEXT: xor a6, a5, a6 6598; RV32IA-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 6599; RV32IA-NEXT: sc.w a6, a6, (a2) 6600; RV32IA-NEXT: bnez a6, .LBB50_1 6601; RV32IA-NEXT: # %bb.4: 6602; RV32IA-NEXT: srl a0, a5, a0 6603; RV32IA-NEXT: ret 6604; 6605; RV64I-LABEL: atomicrmw_min_i8_monotonic: 6606; RV64I: # %bb.0: 6607; RV64I-NEXT: addi sp, sp, -48 6608; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6609; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6610; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6611; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6612; RV64I-NEXT: mv s0, a0 6613; RV64I-NEXT: lbu a3, 0(a0) 6614; RV64I-NEXT: mv s1, a1 6615; RV64I-NEXT: slli a0, a1, 56 6616; RV64I-NEXT: srai s2, a0, 56 6617; RV64I-NEXT: j .LBB50_2 6618; RV64I-NEXT: .LBB50_1: # %atomicrmw.start 6619; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1 6620; RV64I-NEXT: sb a3, 15(sp) 6621; RV64I-NEXT: addi a1, sp, 15 6622; RV64I-NEXT: mv a0, s0 6623; RV64I-NEXT: li a3, 0 6624; RV64I-NEXT: li a4, 0 6625; RV64I-NEXT: call __atomic_compare_exchange_1 6626; RV64I-NEXT: lbu a3, 15(sp) 6627; RV64I-NEXT: bnez a0, .LBB50_4 6628; RV64I-NEXT: .LBB50_2: # %atomicrmw.start 6629; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6630; RV64I-NEXT: slli a0, a3, 56 6631; RV64I-NEXT: srai a0, a0, 56 6632; RV64I-NEXT: mv a2, a3 6633; RV64I-NEXT: bge s2, a0, .LBB50_1 6634; RV64I-NEXT: # %bb.3: # %atomicrmw.start 6635; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1 6636; RV64I-NEXT: mv a2, s1 6637; RV64I-NEXT: j .LBB50_1 6638; RV64I-NEXT: .LBB50_4: # %atomicrmw.end 6639; RV64I-NEXT: mv a0, a3 6640; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6641; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6642; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6643; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6644; RV64I-NEXT: addi sp, sp, 48 6645; RV64I-NEXT: ret 6646; 6647; RV64IA-NOZACAS-LABEL: atomicrmw_min_i8_monotonic: 6648; RV64IA-NOZACAS: # %bb.0: 6649; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 6650; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 6651; RV64IA-NOZACAS-NEXT: li a3, 255 6652; RV64IA-NOZACAS-NEXT: slli a1, a1, 56 6653; RV64IA-NOZACAS-NEXT: andi a4, a0, 24 6654; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 6655; RV64IA-NOZACAS-NEXT: srai a1, a1, 56 6656; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 6657; RV64IA-NOZACAS-NEXT: xori a4, a4, 56 6658; RV64IA-NOZACAS-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 6659; RV64IA-NOZACAS-NEXT: lr.w a5, (a2) 6660; RV64IA-NOZACAS-NEXT: and a7, a5, a3 6661; RV64IA-NOZACAS-NEXT: mv a6, a5 6662; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 6663; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 6664; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB50_3 6665; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 6666; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 6667; RV64IA-NOZACAS-NEXT: and a6, a6, a3 6668; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 6669; RV64IA-NOZACAS-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 6670; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2) 6671; RV64IA-NOZACAS-NEXT: bnez a6, .LBB50_1 6672; RV64IA-NOZACAS-NEXT: # %bb.4: 6673; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 6674; RV64IA-NOZACAS-NEXT: ret 6675; 6676; RV64IA-ZACAS-LABEL: atomicrmw_min_i8_monotonic: 6677; RV64IA-ZACAS: # %bb.0: 6678; RV64IA-ZACAS-NEXT: andi a2, a0, -4 6679; RV64IA-ZACAS-NEXT: slli a0, a0, 3 6680; RV64IA-ZACAS-NEXT: li a3, 255 6681; RV64IA-ZACAS-NEXT: slli a1, a1, 56 6682; RV64IA-ZACAS-NEXT: andi a4, a0, 24 6683; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 6684; RV64IA-ZACAS-NEXT: srai a1, a1, 56 6685; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 6686; RV64IA-ZACAS-NEXT: xori a4, a4, 56 6687; RV64IA-ZACAS-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1 6688; RV64IA-ZACAS-NEXT: lr.w a5, (a2) 6689; RV64IA-ZACAS-NEXT: and a7, a5, a3 6690; RV64IA-ZACAS-NEXT: mv a6, a5 6691; RV64IA-ZACAS-NEXT: sll a7, a7, a4 6692; RV64IA-ZACAS-NEXT: sra a7, a7, a4 6693; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB50_3 6694; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1 6695; RV64IA-ZACAS-NEXT: xor a6, a5, a1 6696; RV64IA-ZACAS-NEXT: and a6, a6, a3 6697; RV64IA-ZACAS-NEXT: xor a6, a5, a6 6698; RV64IA-ZACAS-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1 6699; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2) 6700; RV64IA-ZACAS-NEXT: bnez a6, .LBB50_1 6701; RV64IA-ZACAS-NEXT: # %bb.4: 6702; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 6703; RV64IA-ZACAS-NEXT: ret 6704; 6705; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_monotonic: 6706; RV64IA-WMO-ZABHA: # %bb.0: 6707; RV64IA-WMO-ZABHA-NEXT: amomin.b a0, a1, (a0) 6708; RV64IA-WMO-ZABHA-NEXT: ret 6709; 6710; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_monotonic: 6711; RV64IA-TSO-ZABHA: # %bb.0: 6712; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0) 6713; RV64IA-TSO-ZABHA-NEXT: ret 6714 %1 = atomicrmw min ptr %a, i8 %b monotonic 6715 ret i8 %1 6716} 6717 6718define i8 @atomicrmw_min_i8_acquire(ptr %a, i8 %b) nounwind { 6719; RV32I-LABEL: atomicrmw_min_i8_acquire: 6720; RV32I: # %bb.0: 6721; RV32I-NEXT: addi sp, sp, -32 6722; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6723; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6724; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6725; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6726; RV32I-NEXT: mv s0, a0 6727; RV32I-NEXT: lbu a3, 0(a0) 6728; RV32I-NEXT: mv s1, a1 6729; RV32I-NEXT: slli a0, a1, 24 6730; RV32I-NEXT: srai s2, a0, 24 6731; RV32I-NEXT: j .LBB51_2 6732; RV32I-NEXT: .LBB51_1: # %atomicrmw.start 6733; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1 6734; RV32I-NEXT: sb a3, 15(sp) 6735; RV32I-NEXT: addi a1, sp, 15 6736; RV32I-NEXT: li a3, 2 6737; RV32I-NEXT: li a4, 2 6738; RV32I-NEXT: mv a0, s0 6739; RV32I-NEXT: call __atomic_compare_exchange_1 6740; RV32I-NEXT: lbu a3, 15(sp) 6741; RV32I-NEXT: bnez a0, .LBB51_4 6742; RV32I-NEXT: .LBB51_2: # %atomicrmw.start 6743; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 6744; RV32I-NEXT: slli a0, a3, 24 6745; RV32I-NEXT: srai a0, a0, 24 6746; RV32I-NEXT: mv a2, a3 6747; RV32I-NEXT: bge s2, a0, .LBB51_1 6748; RV32I-NEXT: # %bb.3: # %atomicrmw.start 6749; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1 6750; RV32I-NEXT: mv a2, s1 6751; RV32I-NEXT: j .LBB51_1 6752; RV32I-NEXT: .LBB51_4: # %atomicrmw.end 6753; RV32I-NEXT: mv a0, a3 6754; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6755; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6756; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6757; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 6758; RV32I-NEXT: addi sp, sp, 32 6759; RV32I-NEXT: ret 6760; 6761; RV32IA-WMO-LABEL: atomicrmw_min_i8_acquire: 6762; RV32IA-WMO: # %bb.0: 6763; RV32IA-WMO-NEXT: andi a2, a0, -4 6764; RV32IA-WMO-NEXT: slli a0, a0, 3 6765; RV32IA-WMO-NEXT: li a3, 255 6766; RV32IA-WMO-NEXT: slli a1, a1, 24 6767; RV32IA-WMO-NEXT: andi a4, a0, 24 6768; RV32IA-WMO-NEXT: sll a3, a3, a0 6769; RV32IA-WMO-NEXT: srai a1, a1, 24 6770; RV32IA-WMO-NEXT: sll a1, a1, a0 6771; RV32IA-WMO-NEXT: xori a4, a4, 24 6772; RV32IA-WMO-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 6773; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 6774; RV32IA-WMO-NEXT: and a7, a5, a3 6775; RV32IA-WMO-NEXT: mv a6, a5 6776; RV32IA-WMO-NEXT: sll a7, a7, a4 6777; RV32IA-WMO-NEXT: sra a7, a7, a4 6778; RV32IA-WMO-NEXT: bge a1, a7, .LBB51_3 6779; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 6780; RV32IA-WMO-NEXT: xor a6, a5, a1 6781; RV32IA-WMO-NEXT: and a6, a6, a3 6782; RV32IA-WMO-NEXT: xor a6, a5, a6 6783; RV32IA-WMO-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 6784; RV32IA-WMO-NEXT: sc.w a6, a6, (a2) 6785; RV32IA-WMO-NEXT: bnez a6, .LBB51_1 6786; RV32IA-WMO-NEXT: # %bb.4: 6787; RV32IA-WMO-NEXT: srl a0, a5, a0 6788; RV32IA-WMO-NEXT: ret 6789; 6790; RV32IA-TSO-LABEL: atomicrmw_min_i8_acquire: 6791; RV32IA-TSO: # %bb.0: 6792; RV32IA-TSO-NEXT: andi a2, a0, -4 6793; RV32IA-TSO-NEXT: slli a0, a0, 3 6794; RV32IA-TSO-NEXT: li a3, 255 6795; RV32IA-TSO-NEXT: slli a1, a1, 24 6796; RV32IA-TSO-NEXT: andi a4, a0, 24 6797; RV32IA-TSO-NEXT: sll a3, a3, a0 6798; RV32IA-TSO-NEXT: srai a1, a1, 24 6799; RV32IA-TSO-NEXT: sll a1, a1, a0 6800; RV32IA-TSO-NEXT: xori a4, a4, 24 6801; RV32IA-TSO-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 6802; RV32IA-TSO-NEXT: lr.w a5, (a2) 6803; RV32IA-TSO-NEXT: and a7, a5, a3 6804; RV32IA-TSO-NEXT: mv a6, a5 6805; RV32IA-TSO-NEXT: sll a7, a7, a4 6806; RV32IA-TSO-NEXT: sra a7, a7, a4 6807; RV32IA-TSO-NEXT: bge a1, a7, .LBB51_3 6808; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 6809; RV32IA-TSO-NEXT: xor a6, a5, a1 6810; RV32IA-TSO-NEXT: and a6, a6, a3 6811; RV32IA-TSO-NEXT: xor a6, a5, a6 6812; RV32IA-TSO-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 6813; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 6814; RV32IA-TSO-NEXT: bnez a6, .LBB51_1 6815; RV32IA-TSO-NEXT: # %bb.4: 6816; RV32IA-TSO-NEXT: srl a0, a5, a0 6817; RV32IA-TSO-NEXT: ret 6818; 6819; RV64I-LABEL: atomicrmw_min_i8_acquire: 6820; RV64I: # %bb.0: 6821; RV64I-NEXT: addi sp, sp, -48 6822; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 6823; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 6824; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 6825; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 6826; RV64I-NEXT: mv s0, a0 6827; RV64I-NEXT: lbu a3, 0(a0) 6828; RV64I-NEXT: mv s1, a1 6829; RV64I-NEXT: slli a0, a1, 56 6830; RV64I-NEXT: srai s2, a0, 56 6831; RV64I-NEXT: j .LBB51_2 6832; RV64I-NEXT: .LBB51_1: # %atomicrmw.start 6833; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1 6834; RV64I-NEXT: sb a3, 15(sp) 6835; RV64I-NEXT: addi a1, sp, 15 6836; RV64I-NEXT: li a3, 2 6837; RV64I-NEXT: li a4, 2 6838; RV64I-NEXT: mv a0, s0 6839; RV64I-NEXT: call __atomic_compare_exchange_1 6840; RV64I-NEXT: lbu a3, 15(sp) 6841; RV64I-NEXT: bnez a0, .LBB51_4 6842; RV64I-NEXT: .LBB51_2: # %atomicrmw.start 6843; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6844; RV64I-NEXT: slli a0, a3, 56 6845; RV64I-NEXT: srai a0, a0, 56 6846; RV64I-NEXT: mv a2, a3 6847; RV64I-NEXT: bge s2, a0, .LBB51_1 6848; RV64I-NEXT: # %bb.3: # %atomicrmw.start 6849; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1 6850; RV64I-NEXT: mv a2, s1 6851; RV64I-NEXT: j .LBB51_1 6852; RV64I-NEXT: .LBB51_4: # %atomicrmw.end 6853; RV64I-NEXT: mv a0, a3 6854; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 6855; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 6856; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 6857; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 6858; RV64I-NEXT: addi sp, sp, 48 6859; RV64I-NEXT: ret 6860; 6861; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_acquire: 6862; RV64IA-WMO-NOZACAS: # %bb.0: 6863; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 6864; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 6865; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 6866; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56 6867; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24 6868; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 6869; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56 6870; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 6871; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56 6872; RV64IA-WMO-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 6873; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 6874; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 6875; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 6876; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 6877; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 6878; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB51_3 6879; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 6880; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 6881; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 6882; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 6883; RV64IA-WMO-NOZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 6884; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2) 6885; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB51_1 6886; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 6887; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 6888; RV64IA-WMO-NOZACAS-NEXT: ret 6889; 6890; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_acquire: 6891; RV64IA-TSO-NOZACAS: # %bb.0: 6892; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 6893; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 6894; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 6895; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56 6896; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24 6897; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 6898; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56 6899; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 6900; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56 6901; RV64IA-TSO-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 6902; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 6903; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 6904; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 6905; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 6906; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 6907; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB51_3 6908; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 6909; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 6910; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 6911; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 6912; RV64IA-TSO-NOZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 6913; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 6914; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB51_1 6915; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 6916; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 6917; RV64IA-TSO-NOZACAS-NEXT: ret 6918; 6919; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_acquire: 6920; RV64IA-WMO-ZACAS: # %bb.0: 6921; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 6922; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 6923; RV64IA-WMO-ZACAS-NEXT: li a3, 255 6924; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56 6925; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24 6926; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 6927; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56 6928; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 6929; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56 6930; RV64IA-WMO-ZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 6931; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 6932; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 6933; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 6934; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 6935; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 6936; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB51_3 6937; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 6938; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 6939; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 6940; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 6941; RV64IA-WMO-ZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 6942; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2) 6943; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB51_1 6944; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 6945; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 6946; RV64IA-WMO-ZACAS-NEXT: ret 6947; 6948; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_acquire: 6949; RV64IA-TSO-ZACAS: # %bb.0: 6950; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 6951; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 6952; RV64IA-TSO-ZACAS-NEXT: li a3, 255 6953; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56 6954; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24 6955; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 6956; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56 6957; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 6958; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56 6959; RV64IA-TSO-ZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1 6960; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 6961; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 6962; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 6963; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 6964; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 6965; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB51_3 6966; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1 6967; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 6968; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 6969; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 6970; RV64IA-TSO-ZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1 6971; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 6972; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB51_1 6973; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 6974; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 6975; RV64IA-TSO-ZACAS-NEXT: ret 6976; 6977; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_acquire: 6978; RV64IA-WMO-ZABHA: # %bb.0: 6979; RV64IA-WMO-ZABHA-NEXT: amomin.b.aq a0, a1, (a0) 6980; RV64IA-WMO-ZABHA-NEXT: ret 6981; 6982; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_acquire: 6983; RV64IA-TSO-ZABHA: # %bb.0: 6984; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0) 6985; RV64IA-TSO-ZABHA-NEXT: ret 6986 %1 = atomicrmw min ptr %a, i8 %b acquire 6987 ret i8 %1 6988} 6989 6990define i8 @atomicrmw_min_i8_release(ptr %a, i8 %b) nounwind { 6991; RV32I-LABEL: atomicrmw_min_i8_release: 6992; RV32I: # %bb.0: 6993; RV32I-NEXT: addi sp, sp, -32 6994; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 6995; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 6996; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 6997; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 6998; RV32I-NEXT: mv s0, a0 6999; RV32I-NEXT: lbu a3, 0(a0) 7000; RV32I-NEXT: mv s1, a1 7001; RV32I-NEXT: slli a0, a1, 24 7002; RV32I-NEXT: srai s2, a0, 24 7003; RV32I-NEXT: j .LBB52_2 7004; RV32I-NEXT: .LBB52_1: # %atomicrmw.start 7005; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1 7006; RV32I-NEXT: sb a3, 15(sp) 7007; RV32I-NEXT: addi a1, sp, 15 7008; RV32I-NEXT: li a3, 3 7009; RV32I-NEXT: mv a0, s0 7010; RV32I-NEXT: li a4, 0 7011; RV32I-NEXT: call __atomic_compare_exchange_1 7012; RV32I-NEXT: lbu a3, 15(sp) 7013; RV32I-NEXT: bnez a0, .LBB52_4 7014; RV32I-NEXT: .LBB52_2: # %atomicrmw.start 7015; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7016; RV32I-NEXT: slli a0, a3, 24 7017; RV32I-NEXT: srai a0, a0, 24 7018; RV32I-NEXT: mv a2, a3 7019; RV32I-NEXT: bge s2, a0, .LBB52_1 7020; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7021; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1 7022; RV32I-NEXT: mv a2, s1 7023; RV32I-NEXT: j .LBB52_1 7024; RV32I-NEXT: .LBB52_4: # %atomicrmw.end 7025; RV32I-NEXT: mv a0, a3 7026; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7027; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7028; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7029; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7030; RV32I-NEXT: addi sp, sp, 32 7031; RV32I-NEXT: ret 7032; 7033; RV32IA-WMO-LABEL: atomicrmw_min_i8_release: 7034; RV32IA-WMO: # %bb.0: 7035; RV32IA-WMO-NEXT: andi a2, a0, -4 7036; RV32IA-WMO-NEXT: slli a0, a0, 3 7037; RV32IA-WMO-NEXT: li a3, 255 7038; RV32IA-WMO-NEXT: slli a1, a1, 24 7039; RV32IA-WMO-NEXT: andi a4, a0, 24 7040; RV32IA-WMO-NEXT: sll a3, a3, a0 7041; RV32IA-WMO-NEXT: srai a1, a1, 24 7042; RV32IA-WMO-NEXT: sll a1, a1, a0 7043; RV32IA-WMO-NEXT: xori a4, a4, 24 7044; RV32IA-WMO-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 7045; RV32IA-WMO-NEXT: lr.w a5, (a2) 7046; RV32IA-WMO-NEXT: and a7, a5, a3 7047; RV32IA-WMO-NEXT: mv a6, a5 7048; RV32IA-WMO-NEXT: sll a7, a7, a4 7049; RV32IA-WMO-NEXT: sra a7, a7, a4 7050; RV32IA-WMO-NEXT: bge a1, a7, .LBB52_3 7051; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 7052; RV32IA-WMO-NEXT: xor a6, a5, a1 7053; RV32IA-WMO-NEXT: and a6, a6, a3 7054; RV32IA-WMO-NEXT: xor a6, a5, a6 7055; RV32IA-WMO-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 7056; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 7057; RV32IA-WMO-NEXT: bnez a6, .LBB52_1 7058; RV32IA-WMO-NEXT: # %bb.4: 7059; RV32IA-WMO-NEXT: srl a0, a5, a0 7060; RV32IA-WMO-NEXT: ret 7061; 7062; RV32IA-TSO-LABEL: atomicrmw_min_i8_release: 7063; RV32IA-TSO: # %bb.0: 7064; RV32IA-TSO-NEXT: andi a2, a0, -4 7065; RV32IA-TSO-NEXT: slli a0, a0, 3 7066; RV32IA-TSO-NEXT: li a3, 255 7067; RV32IA-TSO-NEXT: slli a1, a1, 24 7068; RV32IA-TSO-NEXT: andi a4, a0, 24 7069; RV32IA-TSO-NEXT: sll a3, a3, a0 7070; RV32IA-TSO-NEXT: srai a1, a1, 24 7071; RV32IA-TSO-NEXT: sll a1, a1, a0 7072; RV32IA-TSO-NEXT: xori a4, a4, 24 7073; RV32IA-TSO-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 7074; RV32IA-TSO-NEXT: lr.w a5, (a2) 7075; RV32IA-TSO-NEXT: and a7, a5, a3 7076; RV32IA-TSO-NEXT: mv a6, a5 7077; RV32IA-TSO-NEXT: sll a7, a7, a4 7078; RV32IA-TSO-NEXT: sra a7, a7, a4 7079; RV32IA-TSO-NEXT: bge a1, a7, .LBB52_3 7080; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 7081; RV32IA-TSO-NEXT: xor a6, a5, a1 7082; RV32IA-TSO-NEXT: and a6, a6, a3 7083; RV32IA-TSO-NEXT: xor a6, a5, a6 7084; RV32IA-TSO-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 7085; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 7086; RV32IA-TSO-NEXT: bnez a6, .LBB52_1 7087; RV32IA-TSO-NEXT: # %bb.4: 7088; RV32IA-TSO-NEXT: srl a0, a5, a0 7089; RV32IA-TSO-NEXT: ret 7090; 7091; RV64I-LABEL: atomicrmw_min_i8_release: 7092; RV64I: # %bb.0: 7093; RV64I-NEXT: addi sp, sp, -48 7094; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7095; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7096; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7097; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7098; RV64I-NEXT: mv s0, a0 7099; RV64I-NEXT: lbu a3, 0(a0) 7100; RV64I-NEXT: mv s1, a1 7101; RV64I-NEXT: slli a0, a1, 56 7102; RV64I-NEXT: srai s2, a0, 56 7103; RV64I-NEXT: j .LBB52_2 7104; RV64I-NEXT: .LBB52_1: # %atomicrmw.start 7105; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1 7106; RV64I-NEXT: sb a3, 15(sp) 7107; RV64I-NEXT: addi a1, sp, 15 7108; RV64I-NEXT: li a3, 3 7109; RV64I-NEXT: mv a0, s0 7110; RV64I-NEXT: li a4, 0 7111; RV64I-NEXT: call __atomic_compare_exchange_1 7112; RV64I-NEXT: lbu a3, 15(sp) 7113; RV64I-NEXT: bnez a0, .LBB52_4 7114; RV64I-NEXT: .LBB52_2: # %atomicrmw.start 7115; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7116; RV64I-NEXT: slli a0, a3, 56 7117; RV64I-NEXT: srai a0, a0, 56 7118; RV64I-NEXT: mv a2, a3 7119; RV64I-NEXT: bge s2, a0, .LBB52_1 7120; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7121; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1 7122; RV64I-NEXT: mv a2, s1 7123; RV64I-NEXT: j .LBB52_1 7124; RV64I-NEXT: .LBB52_4: # %atomicrmw.end 7125; RV64I-NEXT: mv a0, a3 7126; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7127; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7128; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7129; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7130; RV64I-NEXT: addi sp, sp, 48 7131; RV64I-NEXT: ret 7132; 7133; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_release: 7134; RV64IA-WMO-NOZACAS: # %bb.0: 7135; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 7136; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 7137; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 7138; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56 7139; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24 7140; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 7141; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56 7142; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 7143; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56 7144; RV64IA-WMO-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 7145; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2) 7146; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 7147; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 7148; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 7149; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 7150; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB52_3 7151; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 7152; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 7153; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 7154; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 7155; RV64IA-WMO-NOZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 7156; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 7157; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB52_1 7158; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 7159; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 7160; RV64IA-WMO-NOZACAS-NEXT: ret 7161; 7162; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_release: 7163; RV64IA-TSO-NOZACAS: # %bb.0: 7164; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 7165; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 7166; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 7167; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56 7168; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24 7169; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 7170; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56 7171; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 7172; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56 7173; RV64IA-TSO-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 7174; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 7175; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 7176; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 7177; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 7178; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 7179; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB52_3 7180; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 7181; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 7182; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 7183; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 7184; RV64IA-TSO-NOZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 7185; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 7186; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB52_1 7187; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 7188; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 7189; RV64IA-TSO-NOZACAS-NEXT: ret 7190; 7191; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_release: 7192; RV64IA-WMO-ZACAS: # %bb.0: 7193; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 7194; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 7195; RV64IA-WMO-ZACAS-NEXT: li a3, 255 7196; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56 7197; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24 7198; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 7199; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56 7200; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 7201; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56 7202; RV64IA-WMO-ZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 7203; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2) 7204; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 7205; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 7206; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 7207; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 7208; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB52_3 7209; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 7210; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 7211; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 7212; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 7213; RV64IA-WMO-ZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 7214; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 7215; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB52_1 7216; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 7217; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 7218; RV64IA-WMO-ZACAS-NEXT: ret 7219; 7220; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_release: 7221; RV64IA-TSO-ZACAS: # %bb.0: 7222; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 7223; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 7224; RV64IA-TSO-ZACAS-NEXT: li a3, 255 7225; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56 7226; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24 7227; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 7228; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56 7229; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 7230; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56 7231; RV64IA-TSO-ZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1 7232; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 7233; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 7234; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 7235; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 7236; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 7237; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB52_3 7238; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1 7239; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 7240; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 7241; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 7242; RV64IA-TSO-ZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1 7243; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 7244; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB52_1 7245; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 7246; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 7247; RV64IA-TSO-ZACAS-NEXT: ret 7248; 7249; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_release: 7250; RV64IA-WMO-ZABHA: # %bb.0: 7251; RV64IA-WMO-ZABHA-NEXT: amomin.b.rl a0, a1, (a0) 7252; RV64IA-WMO-ZABHA-NEXT: ret 7253; 7254; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_release: 7255; RV64IA-TSO-ZABHA: # %bb.0: 7256; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0) 7257; RV64IA-TSO-ZABHA-NEXT: ret 7258 %1 = atomicrmw min ptr %a, i8 %b release 7259 ret i8 %1 7260} 7261 7262define i8 @atomicrmw_min_i8_acq_rel(ptr %a, i8 %b) nounwind { 7263; RV32I-LABEL: atomicrmw_min_i8_acq_rel: 7264; RV32I: # %bb.0: 7265; RV32I-NEXT: addi sp, sp, -32 7266; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7267; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7268; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7269; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7270; RV32I-NEXT: mv s0, a0 7271; RV32I-NEXT: lbu a3, 0(a0) 7272; RV32I-NEXT: mv s1, a1 7273; RV32I-NEXT: slli a0, a1, 24 7274; RV32I-NEXT: srai s2, a0, 24 7275; RV32I-NEXT: j .LBB53_2 7276; RV32I-NEXT: .LBB53_1: # %atomicrmw.start 7277; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1 7278; RV32I-NEXT: sb a3, 15(sp) 7279; RV32I-NEXT: addi a1, sp, 15 7280; RV32I-NEXT: li a3, 4 7281; RV32I-NEXT: li a4, 2 7282; RV32I-NEXT: mv a0, s0 7283; RV32I-NEXT: call __atomic_compare_exchange_1 7284; RV32I-NEXT: lbu a3, 15(sp) 7285; RV32I-NEXT: bnez a0, .LBB53_4 7286; RV32I-NEXT: .LBB53_2: # %atomicrmw.start 7287; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7288; RV32I-NEXT: slli a0, a3, 24 7289; RV32I-NEXT: srai a0, a0, 24 7290; RV32I-NEXT: mv a2, a3 7291; RV32I-NEXT: bge s2, a0, .LBB53_1 7292; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7293; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1 7294; RV32I-NEXT: mv a2, s1 7295; RV32I-NEXT: j .LBB53_1 7296; RV32I-NEXT: .LBB53_4: # %atomicrmw.end 7297; RV32I-NEXT: mv a0, a3 7298; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7299; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7300; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7301; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7302; RV32I-NEXT: addi sp, sp, 32 7303; RV32I-NEXT: ret 7304; 7305; RV32IA-WMO-LABEL: atomicrmw_min_i8_acq_rel: 7306; RV32IA-WMO: # %bb.0: 7307; RV32IA-WMO-NEXT: andi a2, a0, -4 7308; RV32IA-WMO-NEXT: slli a0, a0, 3 7309; RV32IA-WMO-NEXT: li a3, 255 7310; RV32IA-WMO-NEXT: slli a1, a1, 24 7311; RV32IA-WMO-NEXT: andi a4, a0, 24 7312; RV32IA-WMO-NEXT: sll a3, a3, a0 7313; RV32IA-WMO-NEXT: srai a1, a1, 24 7314; RV32IA-WMO-NEXT: sll a1, a1, a0 7315; RV32IA-WMO-NEXT: xori a4, a4, 24 7316; RV32IA-WMO-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 7317; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 7318; RV32IA-WMO-NEXT: and a7, a5, a3 7319; RV32IA-WMO-NEXT: mv a6, a5 7320; RV32IA-WMO-NEXT: sll a7, a7, a4 7321; RV32IA-WMO-NEXT: sra a7, a7, a4 7322; RV32IA-WMO-NEXT: bge a1, a7, .LBB53_3 7323; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 7324; RV32IA-WMO-NEXT: xor a6, a5, a1 7325; RV32IA-WMO-NEXT: and a6, a6, a3 7326; RV32IA-WMO-NEXT: xor a6, a5, a6 7327; RV32IA-WMO-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 7328; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 7329; RV32IA-WMO-NEXT: bnez a6, .LBB53_1 7330; RV32IA-WMO-NEXT: # %bb.4: 7331; RV32IA-WMO-NEXT: srl a0, a5, a0 7332; RV32IA-WMO-NEXT: ret 7333; 7334; RV32IA-TSO-LABEL: atomicrmw_min_i8_acq_rel: 7335; RV32IA-TSO: # %bb.0: 7336; RV32IA-TSO-NEXT: andi a2, a0, -4 7337; RV32IA-TSO-NEXT: slli a0, a0, 3 7338; RV32IA-TSO-NEXT: li a3, 255 7339; RV32IA-TSO-NEXT: slli a1, a1, 24 7340; RV32IA-TSO-NEXT: andi a4, a0, 24 7341; RV32IA-TSO-NEXT: sll a3, a3, a0 7342; RV32IA-TSO-NEXT: srai a1, a1, 24 7343; RV32IA-TSO-NEXT: sll a1, a1, a0 7344; RV32IA-TSO-NEXT: xori a4, a4, 24 7345; RV32IA-TSO-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 7346; RV32IA-TSO-NEXT: lr.w a5, (a2) 7347; RV32IA-TSO-NEXT: and a7, a5, a3 7348; RV32IA-TSO-NEXT: mv a6, a5 7349; RV32IA-TSO-NEXT: sll a7, a7, a4 7350; RV32IA-TSO-NEXT: sra a7, a7, a4 7351; RV32IA-TSO-NEXT: bge a1, a7, .LBB53_3 7352; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 7353; RV32IA-TSO-NEXT: xor a6, a5, a1 7354; RV32IA-TSO-NEXT: and a6, a6, a3 7355; RV32IA-TSO-NEXT: xor a6, a5, a6 7356; RV32IA-TSO-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 7357; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 7358; RV32IA-TSO-NEXT: bnez a6, .LBB53_1 7359; RV32IA-TSO-NEXT: # %bb.4: 7360; RV32IA-TSO-NEXT: srl a0, a5, a0 7361; RV32IA-TSO-NEXT: ret 7362; 7363; RV64I-LABEL: atomicrmw_min_i8_acq_rel: 7364; RV64I: # %bb.0: 7365; RV64I-NEXT: addi sp, sp, -48 7366; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7367; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7368; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7369; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7370; RV64I-NEXT: mv s0, a0 7371; RV64I-NEXT: lbu a3, 0(a0) 7372; RV64I-NEXT: mv s1, a1 7373; RV64I-NEXT: slli a0, a1, 56 7374; RV64I-NEXT: srai s2, a0, 56 7375; RV64I-NEXT: j .LBB53_2 7376; RV64I-NEXT: .LBB53_1: # %atomicrmw.start 7377; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1 7378; RV64I-NEXT: sb a3, 15(sp) 7379; RV64I-NEXT: addi a1, sp, 15 7380; RV64I-NEXT: li a3, 4 7381; RV64I-NEXT: li a4, 2 7382; RV64I-NEXT: mv a0, s0 7383; RV64I-NEXT: call __atomic_compare_exchange_1 7384; RV64I-NEXT: lbu a3, 15(sp) 7385; RV64I-NEXT: bnez a0, .LBB53_4 7386; RV64I-NEXT: .LBB53_2: # %atomicrmw.start 7387; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7388; RV64I-NEXT: slli a0, a3, 56 7389; RV64I-NEXT: srai a0, a0, 56 7390; RV64I-NEXT: mv a2, a3 7391; RV64I-NEXT: bge s2, a0, .LBB53_1 7392; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7393; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1 7394; RV64I-NEXT: mv a2, s1 7395; RV64I-NEXT: j .LBB53_1 7396; RV64I-NEXT: .LBB53_4: # %atomicrmw.end 7397; RV64I-NEXT: mv a0, a3 7398; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7399; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7400; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7401; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7402; RV64I-NEXT: addi sp, sp, 48 7403; RV64I-NEXT: ret 7404; 7405; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_acq_rel: 7406; RV64IA-WMO-NOZACAS: # %bb.0: 7407; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 7408; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 7409; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 7410; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56 7411; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24 7412; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 7413; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56 7414; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 7415; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56 7416; RV64IA-WMO-NOZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 7417; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 7418; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 7419; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 7420; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 7421; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 7422; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB53_3 7423; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 7424; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 7425; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 7426; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 7427; RV64IA-WMO-NOZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 7428; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 7429; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB53_1 7430; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 7431; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 7432; RV64IA-WMO-NOZACAS-NEXT: ret 7433; 7434; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_acq_rel: 7435; RV64IA-TSO-NOZACAS: # %bb.0: 7436; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 7437; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 7438; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 7439; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56 7440; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24 7441; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 7442; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56 7443; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 7444; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56 7445; RV64IA-TSO-NOZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 7446; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 7447; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 7448; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 7449; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 7450; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 7451; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB53_3 7452; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 7453; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 7454; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 7455; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 7456; RV64IA-TSO-NOZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 7457; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 7458; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB53_1 7459; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 7460; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 7461; RV64IA-TSO-NOZACAS-NEXT: ret 7462; 7463; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_acq_rel: 7464; RV64IA-WMO-ZACAS: # %bb.0: 7465; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 7466; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 7467; RV64IA-WMO-ZACAS-NEXT: li a3, 255 7468; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56 7469; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24 7470; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 7471; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56 7472; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 7473; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56 7474; RV64IA-WMO-ZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 7475; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 7476; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 7477; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 7478; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 7479; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 7480; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB53_3 7481; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 7482; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 7483; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 7484; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 7485; RV64IA-WMO-ZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 7486; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 7487; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB53_1 7488; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 7489; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 7490; RV64IA-WMO-ZACAS-NEXT: ret 7491; 7492; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_acq_rel: 7493; RV64IA-TSO-ZACAS: # %bb.0: 7494; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 7495; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 7496; RV64IA-TSO-ZACAS-NEXT: li a3, 255 7497; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56 7498; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24 7499; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 7500; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56 7501; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 7502; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56 7503; RV64IA-TSO-ZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1 7504; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 7505; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 7506; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 7507; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 7508; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 7509; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB53_3 7510; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1 7511; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 7512; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 7513; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 7514; RV64IA-TSO-ZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1 7515; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 7516; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB53_1 7517; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 7518; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 7519; RV64IA-TSO-ZACAS-NEXT: ret 7520; 7521; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_acq_rel: 7522; RV64IA-WMO-ZABHA: # %bb.0: 7523; RV64IA-WMO-ZABHA-NEXT: amomin.b.aqrl a0, a1, (a0) 7524; RV64IA-WMO-ZABHA-NEXT: ret 7525; 7526; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_acq_rel: 7527; RV64IA-TSO-ZABHA: # %bb.0: 7528; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0) 7529; RV64IA-TSO-ZABHA-NEXT: ret 7530 %1 = atomicrmw min ptr %a, i8 %b acq_rel 7531 ret i8 %1 7532} 7533 7534define i8 @atomicrmw_min_i8_seq_cst(ptr %a, i8 %b) nounwind { 7535; RV32I-LABEL: atomicrmw_min_i8_seq_cst: 7536; RV32I: # %bb.0: 7537; RV32I-NEXT: addi sp, sp, -32 7538; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7539; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7540; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7541; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7542; RV32I-NEXT: mv s0, a0 7543; RV32I-NEXT: lbu a3, 0(a0) 7544; RV32I-NEXT: mv s1, a1 7545; RV32I-NEXT: slli a0, a1, 24 7546; RV32I-NEXT: srai s2, a0, 24 7547; RV32I-NEXT: j .LBB54_2 7548; RV32I-NEXT: .LBB54_1: # %atomicrmw.start 7549; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1 7550; RV32I-NEXT: sb a3, 15(sp) 7551; RV32I-NEXT: addi a1, sp, 15 7552; RV32I-NEXT: li a3, 5 7553; RV32I-NEXT: li a4, 5 7554; RV32I-NEXT: mv a0, s0 7555; RV32I-NEXT: call __atomic_compare_exchange_1 7556; RV32I-NEXT: lbu a3, 15(sp) 7557; RV32I-NEXT: bnez a0, .LBB54_4 7558; RV32I-NEXT: .LBB54_2: # %atomicrmw.start 7559; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7560; RV32I-NEXT: slli a0, a3, 24 7561; RV32I-NEXT: srai a0, a0, 24 7562; RV32I-NEXT: mv a2, a3 7563; RV32I-NEXT: bge s2, a0, .LBB54_1 7564; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7565; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1 7566; RV32I-NEXT: mv a2, s1 7567; RV32I-NEXT: j .LBB54_1 7568; RV32I-NEXT: .LBB54_4: # %atomicrmw.end 7569; RV32I-NEXT: mv a0, a3 7570; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7571; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7572; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7573; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7574; RV32I-NEXT: addi sp, sp, 32 7575; RV32I-NEXT: ret 7576; 7577; RV32IA-LABEL: atomicrmw_min_i8_seq_cst: 7578; RV32IA: # %bb.0: 7579; RV32IA-NEXT: andi a2, a0, -4 7580; RV32IA-NEXT: slli a0, a0, 3 7581; RV32IA-NEXT: li a3, 255 7582; RV32IA-NEXT: slli a1, a1, 24 7583; RV32IA-NEXT: andi a4, a0, 24 7584; RV32IA-NEXT: sll a3, a3, a0 7585; RV32IA-NEXT: srai a1, a1, 24 7586; RV32IA-NEXT: sll a1, a1, a0 7587; RV32IA-NEXT: xori a4, a4, 24 7588; RV32IA-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 7589; RV32IA-NEXT: lr.w.aqrl a5, (a2) 7590; RV32IA-NEXT: and a7, a5, a3 7591; RV32IA-NEXT: mv a6, a5 7592; RV32IA-NEXT: sll a7, a7, a4 7593; RV32IA-NEXT: sra a7, a7, a4 7594; RV32IA-NEXT: bge a1, a7, .LBB54_3 7595; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 7596; RV32IA-NEXT: xor a6, a5, a1 7597; RV32IA-NEXT: and a6, a6, a3 7598; RV32IA-NEXT: xor a6, a5, a6 7599; RV32IA-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 7600; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 7601; RV32IA-NEXT: bnez a6, .LBB54_1 7602; RV32IA-NEXT: # %bb.4: 7603; RV32IA-NEXT: srl a0, a5, a0 7604; RV32IA-NEXT: ret 7605; 7606; RV64I-LABEL: atomicrmw_min_i8_seq_cst: 7607; RV64I: # %bb.0: 7608; RV64I-NEXT: addi sp, sp, -48 7609; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7610; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7611; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7612; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7613; RV64I-NEXT: mv s0, a0 7614; RV64I-NEXT: lbu a3, 0(a0) 7615; RV64I-NEXT: mv s1, a1 7616; RV64I-NEXT: slli a0, a1, 56 7617; RV64I-NEXT: srai s2, a0, 56 7618; RV64I-NEXT: j .LBB54_2 7619; RV64I-NEXT: .LBB54_1: # %atomicrmw.start 7620; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1 7621; RV64I-NEXT: sb a3, 15(sp) 7622; RV64I-NEXT: addi a1, sp, 15 7623; RV64I-NEXT: li a3, 5 7624; RV64I-NEXT: li a4, 5 7625; RV64I-NEXT: mv a0, s0 7626; RV64I-NEXT: call __atomic_compare_exchange_1 7627; RV64I-NEXT: lbu a3, 15(sp) 7628; RV64I-NEXT: bnez a0, .LBB54_4 7629; RV64I-NEXT: .LBB54_2: # %atomicrmw.start 7630; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7631; RV64I-NEXT: slli a0, a3, 56 7632; RV64I-NEXT: srai a0, a0, 56 7633; RV64I-NEXT: mv a2, a3 7634; RV64I-NEXT: bge s2, a0, .LBB54_1 7635; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7636; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1 7637; RV64I-NEXT: mv a2, s1 7638; RV64I-NEXT: j .LBB54_1 7639; RV64I-NEXT: .LBB54_4: # %atomicrmw.end 7640; RV64I-NEXT: mv a0, a3 7641; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7642; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7643; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7644; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7645; RV64I-NEXT: addi sp, sp, 48 7646; RV64I-NEXT: ret 7647; 7648; RV64IA-NOZACAS-LABEL: atomicrmw_min_i8_seq_cst: 7649; RV64IA-NOZACAS: # %bb.0: 7650; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 7651; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 7652; RV64IA-NOZACAS-NEXT: li a3, 255 7653; RV64IA-NOZACAS-NEXT: slli a1, a1, 56 7654; RV64IA-NOZACAS-NEXT: andi a4, a0, 24 7655; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 7656; RV64IA-NOZACAS-NEXT: srai a1, a1, 56 7657; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 7658; RV64IA-NOZACAS-NEXT: xori a4, a4, 56 7659; RV64IA-NOZACAS-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 7660; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2) 7661; RV64IA-NOZACAS-NEXT: and a7, a5, a3 7662; RV64IA-NOZACAS-NEXT: mv a6, a5 7663; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 7664; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 7665; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB54_3 7666; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 7667; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 7668; RV64IA-NOZACAS-NEXT: and a6, a6, a3 7669; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 7670; RV64IA-NOZACAS-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 7671; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 7672; RV64IA-NOZACAS-NEXT: bnez a6, .LBB54_1 7673; RV64IA-NOZACAS-NEXT: # %bb.4: 7674; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 7675; RV64IA-NOZACAS-NEXT: ret 7676; 7677; RV64IA-ZACAS-LABEL: atomicrmw_min_i8_seq_cst: 7678; RV64IA-ZACAS: # %bb.0: 7679; RV64IA-ZACAS-NEXT: andi a2, a0, -4 7680; RV64IA-ZACAS-NEXT: slli a0, a0, 3 7681; RV64IA-ZACAS-NEXT: li a3, 255 7682; RV64IA-ZACAS-NEXT: slli a1, a1, 56 7683; RV64IA-ZACAS-NEXT: andi a4, a0, 24 7684; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 7685; RV64IA-ZACAS-NEXT: srai a1, a1, 56 7686; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 7687; RV64IA-ZACAS-NEXT: xori a4, a4, 56 7688; RV64IA-ZACAS-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1 7689; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2) 7690; RV64IA-ZACAS-NEXT: and a7, a5, a3 7691; RV64IA-ZACAS-NEXT: mv a6, a5 7692; RV64IA-ZACAS-NEXT: sll a7, a7, a4 7693; RV64IA-ZACAS-NEXT: sra a7, a7, a4 7694; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB54_3 7695; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1 7696; RV64IA-ZACAS-NEXT: xor a6, a5, a1 7697; RV64IA-ZACAS-NEXT: and a6, a6, a3 7698; RV64IA-ZACAS-NEXT: xor a6, a5, a6 7699; RV64IA-ZACAS-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1 7700; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 7701; RV64IA-ZACAS-NEXT: bnez a6, .LBB54_1 7702; RV64IA-ZACAS-NEXT: # %bb.4: 7703; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 7704; RV64IA-ZACAS-NEXT: ret 7705; 7706; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_seq_cst: 7707; RV64IA-WMO-ZABHA: # %bb.0: 7708; RV64IA-WMO-ZABHA-NEXT: amomin.b.aqrl a0, a1, (a0) 7709; RV64IA-WMO-ZABHA-NEXT: ret 7710; 7711; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_seq_cst: 7712; RV64IA-TSO-ZABHA: # %bb.0: 7713; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0) 7714; RV64IA-TSO-ZABHA-NEXT: ret 7715 %1 = atomicrmw min ptr %a, i8 %b seq_cst 7716 ret i8 %1 7717} 7718 7719define i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind { 7720; RV32I-LABEL: atomicrmw_umax_i8_monotonic: 7721; RV32I: # %bb.0: 7722; RV32I-NEXT: addi sp, sp, -32 7723; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7724; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7725; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7726; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7727; RV32I-NEXT: mv s0, a0 7728; RV32I-NEXT: lbu a3, 0(a0) 7729; RV32I-NEXT: mv s1, a1 7730; RV32I-NEXT: andi s2, a1, 255 7731; RV32I-NEXT: j .LBB55_2 7732; RV32I-NEXT: .LBB55_1: # %atomicrmw.start 7733; RV32I-NEXT: # in Loop: Header=BB55_2 Depth=1 7734; RV32I-NEXT: sb a3, 15(sp) 7735; RV32I-NEXT: addi a1, sp, 15 7736; RV32I-NEXT: mv a0, s0 7737; RV32I-NEXT: li a3, 0 7738; RV32I-NEXT: li a4, 0 7739; RV32I-NEXT: call __atomic_compare_exchange_1 7740; RV32I-NEXT: lbu a3, 15(sp) 7741; RV32I-NEXT: bnez a0, .LBB55_4 7742; RV32I-NEXT: .LBB55_2: # %atomicrmw.start 7743; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7744; RV32I-NEXT: andi a0, a3, 255 7745; RV32I-NEXT: mv a2, a3 7746; RV32I-NEXT: bltu s2, a0, .LBB55_1 7747; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7748; RV32I-NEXT: # in Loop: Header=BB55_2 Depth=1 7749; RV32I-NEXT: mv a2, s1 7750; RV32I-NEXT: j .LBB55_1 7751; RV32I-NEXT: .LBB55_4: # %atomicrmw.end 7752; RV32I-NEXT: mv a0, a3 7753; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7754; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7755; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7756; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7757; RV32I-NEXT: addi sp, sp, 32 7758; RV32I-NEXT: ret 7759; 7760; RV32IA-LABEL: atomicrmw_umax_i8_monotonic: 7761; RV32IA: # %bb.0: 7762; RV32IA-NEXT: andi a2, a0, -4 7763; RV32IA-NEXT: slli a0, a0, 3 7764; RV32IA-NEXT: li a3, 255 7765; RV32IA-NEXT: andi a1, a1, 255 7766; RV32IA-NEXT: sll a3, a3, a0 7767; RV32IA-NEXT: sll a1, a1, a0 7768; RV32IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 7769; RV32IA-NEXT: lr.w a4, (a2) 7770; RV32IA-NEXT: and a6, a4, a3 7771; RV32IA-NEXT: mv a5, a4 7772; RV32IA-NEXT: bgeu a6, a1, .LBB55_3 7773; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB55_1 Depth=1 7774; RV32IA-NEXT: xor a5, a4, a1 7775; RV32IA-NEXT: and a5, a5, a3 7776; RV32IA-NEXT: xor a5, a4, a5 7777; RV32IA-NEXT: .LBB55_3: # in Loop: Header=BB55_1 Depth=1 7778; RV32IA-NEXT: sc.w a5, a5, (a2) 7779; RV32IA-NEXT: bnez a5, .LBB55_1 7780; RV32IA-NEXT: # %bb.4: 7781; RV32IA-NEXT: srl a0, a4, a0 7782; RV32IA-NEXT: ret 7783; 7784; RV64I-LABEL: atomicrmw_umax_i8_monotonic: 7785; RV64I: # %bb.0: 7786; RV64I-NEXT: addi sp, sp, -48 7787; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7788; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7789; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7790; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7791; RV64I-NEXT: mv s0, a0 7792; RV64I-NEXT: lbu a3, 0(a0) 7793; RV64I-NEXT: mv s1, a1 7794; RV64I-NEXT: andi s2, a1, 255 7795; RV64I-NEXT: j .LBB55_2 7796; RV64I-NEXT: .LBB55_1: # %atomicrmw.start 7797; RV64I-NEXT: # in Loop: Header=BB55_2 Depth=1 7798; RV64I-NEXT: sb a3, 15(sp) 7799; RV64I-NEXT: addi a1, sp, 15 7800; RV64I-NEXT: mv a0, s0 7801; RV64I-NEXT: li a3, 0 7802; RV64I-NEXT: li a4, 0 7803; RV64I-NEXT: call __atomic_compare_exchange_1 7804; RV64I-NEXT: lbu a3, 15(sp) 7805; RV64I-NEXT: bnez a0, .LBB55_4 7806; RV64I-NEXT: .LBB55_2: # %atomicrmw.start 7807; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7808; RV64I-NEXT: andi a0, a3, 255 7809; RV64I-NEXT: mv a2, a3 7810; RV64I-NEXT: bltu s2, a0, .LBB55_1 7811; RV64I-NEXT: # %bb.3: # %atomicrmw.start 7812; RV64I-NEXT: # in Loop: Header=BB55_2 Depth=1 7813; RV64I-NEXT: mv a2, s1 7814; RV64I-NEXT: j .LBB55_1 7815; RV64I-NEXT: .LBB55_4: # %atomicrmw.end 7816; RV64I-NEXT: mv a0, a3 7817; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 7818; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 7819; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 7820; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 7821; RV64I-NEXT: addi sp, sp, 48 7822; RV64I-NEXT: ret 7823; 7824; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i8_monotonic: 7825; RV64IA-NOZACAS: # %bb.0: 7826; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 7827; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 7828; RV64IA-NOZACAS-NEXT: li a3, 255 7829; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 7830; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 7831; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 7832; RV64IA-NOZACAS-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 7833; RV64IA-NOZACAS-NEXT: lr.w a4, (a2) 7834; RV64IA-NOZACAS-NEXT: and a6, a4, a3 7835; RV64IA-NOZACAS-NEXT: mv a5, a4 7836; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB55_3 7837; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB55_1 Depth=1 7838; RV64IA-NOZACAS-NEXT: xor a5, a4, a1 7839; RV64IA-NOZACAS-NEXT: and a5, a5, a3 7840; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 7841; RV64IA-NOZACAS-NEXT: .LBB55_3: # in Loop: Header=BB55_1 Depth=1 7842; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 7843; RV64IA-NOZACAS-NEXT: bnez a5, .LBB55_1 7844; RV64IA-NOZACAS-NEXT: # %bb.4: 7845; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 7846; RV64IA-NOZACAS-NEXT: ret 7847; 7848; RV64IA-ZACAS-LABEL: atomicrmw_umax_i8_monotonic: 7849; RV64IA-ZACAS: # %bb.0: 7850; RV64IA-ZACAS-NEXT: andi a2, a0, -4 7851; RV64IA-ZACAS-NEXT: slli a0, a0, 3 7852; RV64IA-ZACAS-NEXT: li a3, 255 7853; RV64IA-ZACAS-NEXT: andi a1, a1, 255 7854; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 7855; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 7856; RV64IA-ZACAS-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 7857; RV64IA-ZACAS-NEXT: lr.w a4, (a2) 7858; RV64IA-ZACAS-NEXT: and a6, a4, a3 7859; RV64IA-ZACAS-NEXT: mv a5, a4 7860; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB55_3 7861; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB55_1 Depth=1 7862; RV64IA-ZACAS-NEXT: xor a5, a4, a1 7863; RV64IA-ZACAS-NEXT: and a5, a5, a3 7864; RV64IA-ZACAS-NEXT: xor a5, a4, a5 7865; RV64IA-ZACAS-NEXT: .LBB55_3: # in Loop: Header=BB55_1 Depth=1 7866; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 7867; RV64IA-ZACAS-NEXT: bnez a5, .LBB55_1 7868; RV64IA-ZACAS-NEXT: # %bb.4: 7869; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 7870; RV64IA-ZACAS-NEXT: ret 7871; 7872; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_monotonic: 7873; RV64IA-WMO-ZABHA: # %bb.0: 7874; RV64IA-WMO-ZABHA-NEXT: amomaxu.b a0, a1, (a0) 7875; RV64IA-WMO-ZABHA-NEXT: ret 7876; 7877; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_monotonic: 7878; RV64IA-TSO-ZABHA: # %bb.0: 7879; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0) 7880; RV64IA-TSO-ZABHA-NEXT: ret 7881 %1 = atomicrmw umax ptr %a, i8 %b monotonic 7882 ret i8 %1 7883} 7884 7885define i8 @atomicrmw_umax_i8_acquire(ptr %a, i8 %b) nounwind { 7886; RV32I-LABEL: atomicrmw_umax_i8_acquire: 7887; RV32I: # %bb.0: 7888; RV32I-NEXT: addi sp, sp, -32 7889; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 7890; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 7891; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 7892; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 7893; RV32I-NEXT: mv s0, a0 7894; RV32I-NEXT: lbu a3, 0(a0) 7895; RV32I-NEXT: mv s1, a1 7896; RV32I-NEXT: andi s2, a1, 255 7897; RV32I-NEXT: j .LBB56_2 7898; RV32I-NEXT: .LBB56_1: # %atomicrmw.start 7899; RV32I-NEXT: # in Loop: Header=BB56_2 Depth=1 7900; RV32I-NEXT: sb a3, 15(sp) 7901; RV32I-NEXT: addi a1, sp, 15 7902; RV32I-NEXT: li a3, 2 7903; RV32I-NEXT: li a4, 2 7904; RV32I-NEXT: mv a0, s0 7905; RV32I-NEXT: call __atomic_compare_exchange_1 7906; RV32I-NEXT: lbu a3, 15(sp) 7907; RV32I-NEXT: bnez a0, .LBB56_4 7908; RV32I-NEXT: .LBB56_2: # %atomicrmw.start 7909; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7910; RV32I-NEXT: andi a0, a3, 255 7911; RV32I-NEXT: mv a2, a3 7912; RV32I-NEXT: bltu s2, a0, .LBB56_1 7913; RV32I-NEXT: # %bb.3: # %atomicrmw.start 7914; RV32I-NEXT: # in Loop: Header=BB56_2 Depth=1 7915; RV32I-NEXT: mv a2, s1 7916; RV32I-NEXT: j .LBB56_1 7917; RV32I-NEXT: .LBB56_4: # %atomicrmw.end 7918; RV32I-NEXT: mv a0, a3 7919; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 7920; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 7921; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 7922; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 7923; RV32I-NEXT: addi sp, sp, 32 7924; RV32I-NEXT: ret 7925; 7926; RV32IA-WMO-LABEL: atomicrmw_umax_i8_acquire: 7927; RV32IA-WMO: # %bb.0: 7928; RV32IA-WMO-NEXT: andi a2, a0, -4 7929; RV32IA-WMO-NEXT: slli a0, a0, 3 7930; RV32IA-WMO-NEXT: li a3, 255 7931; RV32IA-WMO-NEXT: andi a1, a1, 255 7932; RV32IA-WMO-NEXT: sll a3, a3, a0 7933; RV32IA-WMO-NEXT: sll a1, a1, a0 7934; RV32IA-WMO-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 7935; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 7936; RV32IA-WMO-NEXT: and a6, a4, a3 7937; RV32IA-WMO-NEXT: mv a5, a4 7938; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB56_3 7939; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1 7940; RV32IA-WMO-NEXT: xor a5, a4, a1 7941; RV32IA-WMO-NEXT: and a5, a5, a3 7942; RV32IA-WMO-NEXT: xor a5, a4, a5 7943; RV32IA-WMO-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1 7944; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 7945; RV32IA-WMO-NEXT: bnez a5, .LBB56_1 7946; RV32IA-WMO-NEXT: # %bb.4: 7947; RV32IA-WMO-NEXT: srl a0, a4, a0 7948; RV32IA-WMO-NEXT: ret 7949; 7950; RV32IA-TSO-LABEL: atomicrmw_umax_i8_acquire: 7951; RV32IA-TSO: # %bb.0: 7952; RV32IA-TSO-NEXT: andi a2, a0, -4 7953; RV32IA-TSO-NEXT: slli a0, a0, 3 7954; RV32IA-TSO-NEXT: li a3, 255 7955; RV32IA-TSO-NEXT: andi a1, a1, 255 7956; RV32IA-TSO-NEXT: sll a3, a3, a0 7957; RV32IA-TSO-NEXT: sll a1, a1, a0 7958; RV32IA-TSO-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 7959; RV32IA-TSO-NEXT: lr.w a4, (a2) 7960; RV32IA-TSO-NEXT: and a6, a4, a3 7961; RV32IA-TSO-NEXT: mv a5, a4 7962; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB56_3 7963; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1 7964; RV32IA-TSO-NEXT: xor a5, a4, a1 7965; RV32IA-TSO-NEXT: and a5, a5, a3 7966; RV32IA-TSO-NEXT: xor a5, a4, a5 7967; RV32IA-TSO-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1 7968; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 7969; RV32IA-TSO-NEXT: bnez a5, .LBB56_1 7970; RV32IA-TSO-NEXT: # %bb.4: 7971; RV32IA-TSO-NEXT: srl a0, a4, a0 7972; RV32IA-TSO-NEXT: ret 7973; 7974; RV64I-LABEL: atomicrmw_umax_i8_acquire: 7975; RV64I: # %bb.0: 7976; RV64I-NEXT: addi sp, sp, -48 7977; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 7978; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 7979; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 7980; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 7981; RV64I-NEXT: mv s0, a0 7982; RV64I-NEXT: lbu a3, 0(a0) 7983; RV64I-NEXT: mv s1, a1 7984; RV64I-NEXT: andi s2, a1, 255 7985; RV64I-NEXT: j .LBB56_2 7986; RV64I-NEXT: .LBB56_1: # %atomicrmw.start 7987; RV64I-NEXT: # in Loop: Header=BB56_2 Depth=1 7988; RV64I-NEXT: sb a3, 15(sp) 7989; RV64I-NEXT: addi a1, sp, 15 7990; RV64I-NEXT: li a3, 2 7991; RV64I-NEXT: li a4, 2 7992; RV64I-NEXT: mv a0, s0 7993; RV64I-NEXT: call __atomic_compare_exchange_1 7994; RV64I-NEXT: lbu a3, 15(sp) 7995; RV64I-NEXT: bnez a0, .LBB56_4 7996; RV64I-NEXT: .LBB56_2: # %atomicrmw.start 7997; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7998; RV64I-NEXT: andi a0, a3, 255 7999; RV64I-NEXT: mv a2, a3 8000; RV64I-NEXT: bltu s2, a0, .LBB56_1 8001; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8002; RV64I-NEXT: # in Loop: Header=BB56_2 Depth=1 8003; RV64I-NEXT: mv a2, s1 8004; RV64I-NEXT: j .LBB56_1 8005; RV64I-NEXT: .LBB56_4: # %atomicrmw.end 8006; RV64I-NEXT: mv a0, a3 8007; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8008; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8009; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8010; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8011; RV64I-NEXT: addi sp, sp, 48 8012; RV64I-NEXT: ret 8013; 8014; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_acquire: 8015; RV64IA-WMO-NOZACAS: # %bb.0: 8016; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 8017; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 8018; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 8019; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 8020; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 8021; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 8022; RV64IA-WMO-NOZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 8023; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 8024; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3 8025; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4 8026; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB56_3 8027; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1 8028; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1 8029; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 8030; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 8031; RV64IA-WMO-NOZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1 8032; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 8033; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB56_1 8034; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 8035; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 8036; RV64IA-WMO-NOZACAS-NEXT: ret 8037; 8038; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_acquire: 8039; RV64IA-TSO-NOZACAS: # %bb.0: 8040; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 8041; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 8042; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 8043; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 8044; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 8045; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 8046; RV64IA-TSO-NOZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 8047; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 8048; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3 8049; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4 8050; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB56_3 8051; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1 8052; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1 8053; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 8054; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 8055; RV64IA-TSO-NOZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1 8056; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 8057; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB56_1 8058; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 8059; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 8060; RV64IA-TSO-NOZACAS-NEXT: ret 8061; 8062; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_acquire: 8063; RV64IA-WMO-ZACAS: # %bb.0: 8064; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 8065; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 8066; RV64IA-WMO-ZACAS-NEXT: li a3, 255 8067; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 8068; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 8069; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 8070; RV64IA-WMO-ZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 8071; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 8072; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3 8073; RV64IA-WMO-ZACAS-NEXT: mv a5, a4 8074; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB56_3 8075; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1 8076; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1 8077; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 8078; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 8079; RV64IA-WMO-ZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1 8080; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 8081; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB56_1 8082; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 8083; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 8084; RV64IA-WMO-ZACAS-NEXT: ret 8085; 8086; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_acquire: 8087; RV64IA-TSO-ZACAS: # %bb.0: 8088; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 8089; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 8090; RV64IA-TSO-ZACAS-NEXT: li a3, 255 8091; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 8092; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 8093; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 8094; RV64IA-TSO-ZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 8095; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 8096; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3 8097; RV64IA-TSO-ZACAS-NEXT: mv a5, a4 8098; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB56_3 8099; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1 8100; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1 8101; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 8102; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 8103; RV64IA-TSO-ZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1 8104; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 8105; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB56_1 8106; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 8107; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 8108; RV64IA-TSO-ZACAS-NEXT: ret 8109; 8110; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_acquire: 8111; RV64IA-WMO-ZABHA: # %bb.0: 8112; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.aq a0, a1, (a0) 8113; RV64IA-WMO-ZABHA-NEXT: ret 8114; 8115; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_acquire: 8116; RV64IA-TSO-ZABHA: # %bb.0: 8117; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0) 8118; RV64IA-TSO-ZABHA-NEXT: ret 8119 %1 = atomicrmw umax ptr %a, i8 %b acquire 8120 ret i8 %1 8121} 8122 8123define i8 @atomicrmw_umax_i8_release(ptr %a, i8 %b) nounwind { 8124; RV32I-LABEL: atomicrmw_umax_i8_release: 8125; RV32I: # %bb.0: 8126; RV32I-NEXT: addi sp, sp, -32 8127; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8128; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8129; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8130; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8131; RV32I-NEXT: mv s0, a0 8132; RV32I-NEXT: lbu a3, 0(a0) 8133; RV32I-NEXT: mv s1, a1 8134; RV32I-NEXT: andi s2, a1, 255 8135; RV32I-NEXT: j .LBB57_2 8136; RV32I-NEXT: .LBB57_1: # %atomicrmw.start 8137; RV32I-NEXT: # in Loop: Header=BB57_2 Depth=1 8138; RV32I-NEXT: sb a3, 15(sp) 8139; RV32I-NEXT: addi a1, sp, 15 8140; RV32I-NEXT: li a3, 3 8141; RV32I-NEXT: mv a0, s0 8142; RV32I-NEXT: li a4, 0 8143; RV32I-NEXT: call __atomic_compare_exchange_1 8144; RV32I-NEXT: lbu a3, 15(sp) 8145; RV32I-NEXT: bnez a0, .LBB57_4 8146; RV32I-NEXT: .LBB57_2: # %atomicrmw.start 8147; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8148; RV32I-NEXT: andi a0, a3, 255 8149; RV32I-NEXT: mv a2, a3 8150; RV32I-NEXT: bltu s2, a0, .LBB57_1 8151; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8152; RV32I-NEXT: # in Loop: Header=BB57_2 Depth=1 8153; RV32I-NEXT: mv a2, s1 8154; RV32I-NEXT: j .LBB57_1 8155; RV32I-NEXT: .LBB57_4: # %atomicrmw.end 8156; RV32I-NEXT: mv a0, a3 8157; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8158; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8159; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8160; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8161; RV32I-NEXT: addi sp, sp, 32 8162; RV32I-NEXT: ret 8163; 8164; RV32IA-WMO-LABEL: atomicrmw_umax_i8_release: 8165; RV32IA-WMO: # %bb.0: 8166; RV32IA-WMO-NEXT: andi a2, a0, -4 8167; RV32IA-WMO-NEXT: slli a0, a0, 3 8168; RV32IA-WMO-NEXT: li a3, 255 8169; RV32IA-WMO-NEXT: andi a1, a1, 255 8170; RV32IA-WMO-NEXT: sll a3, a3, a0 8171; RV32IA-WMO-NEXT: sll a1, a1, a0 8172; RV32IA-WMO-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 8173; RV32IA-WMO-NEXT: lr.w a4, (a2) 8174; RV32IA-WMO-NEXT: and a6, a4, a3 8175; RV32IA-WMO-NEXT: mv a5, a4 8176; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB57_3 8177; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1 8178; RV32IA-WMO-NEXT: xor a5, a4, a1 8179; RV32IA-WMO-NEXT: and a5, a5, a3 8180; RV32IA-WMO-NEXT: xor a5, a4, a5 8181; RV32IA-WMO-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1 8182; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 8183; RV32IA-WMO-NEXT: bnez a5, .LBB57_1 8184; RV32IA-WMO-NEXT: # %bb.4: 8185; RV32IA-WMO-NEXT: srl a0, a4, a0 8186; RV32IA-WMO-NEXT: ret 8187; 8188; RV32IA-TSO-LABEL: atomicrmw_umax_i8_release: 8189; RV32IA-TSO: # %bb.0: 8190; RV32IA-TSO-NEXT: andi a2, a0, -4 8191; RV32IA-TSO-NEXT: slli a0, a0, 3 8192; RV32IA-TSO-NEXT: li a3, 255 8193; RV32IA-TSO-NEXT: andi a1, a1, 255 8194; RV32IA-TSO-NEXT: sll a3, a3, a0 8195; RV32IA-TSO-NEXT: sll a1, a1, a0 8196; RV32IA-TSO-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 8197; RV32IA-TSO-NEXT: lr.w a4, (a2) 8198; RV32IA-TSO-NEXT: and a6, a4, a3 8199; RV32IA-TSO-NEXT: mv a5, a4 8200; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB57_3 8201; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1 8202; RV32IA-TSO-NEXT: xor a5, a4, a1 8203; RV32IA-TSO-NEXT: and a5, a5, a3 8204; RV32IA-TSO-NEXT: xor a5, a4, a5 8205; RV32IA-TSO-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1 8206; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 8207; RV32IA-TSO-NEXT: bnez a5, .LBB57_1 8208; RV32IA-TSO-NEXT: # %bb.4: 8209; RV32IA-TSO-NEXT: srl a0, a4, a0 8210; RV32IA-TSO-NEXT: ret 8211; 8212; RV64I-LABEL: atomicrmw_umax_i8_release: 8213; RV64I: # %bb.0: 8214; RV64I-NEXT: addi sp, sp, -48 8215; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8216; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8217; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8218; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8219; RV64I-NEXT: mv s0, a0 8220; RV64I-NEXT: lbu a3, 0(a0) 8221; RV64I-NEXT: mv s1, a1 8222; RV64I-NEXT: andi s2, a1, 255 8223; RV64I-NEXT: j .LBB57_2 8224; RV64I-NEXT: .LBB57_1: # %atomicrmw.start 8225; RV64I-NEXT: # in Loop: Header=BB57_2 Depth=1 8226; RV64I-NEXT: sb a3, 15(sp) 8227; RV64I-NEXT: addi a1, sp, 15 8228; RV64I-NEXT: li a3, 3 8229; RV64I-NEXT: mv a0, s0 8230; RV64I-NEXT: li a4, 0 8231; RV64I-NEXT: call __atomic_compare_exchange_1 8232; RV64I-NEXT: lbu a3, 15(sp) 8233; RV64I-NEXT: bnez a0, .LBB57_4 8234; RV64I-NEXT: .LBB57_2: # %atomicrmw.start 8235; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8236; RV64I-NEXT: andi a0, a3, 255 8237; RV64I-NEXT: mv a2, a3 8238; RV64I-NEXT: bltu s2, a0, .LBB57_1 8239; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8240; RV64I-NEXT: # in Loop: Header=BB57_2 Depth=1 8241; RV64I-NEXT: mv a2, s1 8242; RV64I-NEXT: j .LBB57_1 8243; RV64I-NEXT: .LBB57_4: # %atomicrmw.end 8244; RV64I-NEXT: mv a0, a3 8245; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8246; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8247; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8248; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8249; RV64I-NEXT: addi sp, sp, 48 8250; RV64I-NEXT: ret 8251; 8252; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_release: 8253; RV64IA-WMO-NOZACAS: # %bb.0: 8254; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 8255; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 8256; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 8257; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 8258; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 8259; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 8260; RV64IA-WMO-NOZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 8261; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2) 8262; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3 8263; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4 8264; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB57_3 8265; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1 8266; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1 8267; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 8268; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 8269; RV64IA-WMO-NOZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1 8270; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 8271; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB57_1 8272; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 8273; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 8274; RV64IA-WMO-NOZACAS-NEXT: ret 8275; 8276; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_release: 8277; RV64IA-TSO-NOZACAS: # %bb.0: 8278; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 8279; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 8280; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 8281; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 8282; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 8283; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 8284; RV64IA-TSO-NOZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 8285; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 8286; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3 8287; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4 8288; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB57_3 8289; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1 8290; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1 8291; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 8292; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 8293; RV64IA-TSO-NOZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1 8294; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 8295; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB57_1 8296; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 8297; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 8298; RV64IA-TSO-NOZACAS-NEXT: ret 8299; 8300; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_release: 8301; RV64IA-WMO-ZACAS: # %bb.0: 8302; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 8303; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 8304; RV64IA-WMO-ZACAS-NEXT: li a3, 255 8305; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 8306; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 8307; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 8308; RV64IA-WMO-ZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 8309; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2) 8310; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3 8311; RV64IA-WMO-ZACAS-NEXT: mv a5, a4 8312; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB57_3 8313; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1 8314; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1 8315; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 8316; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 8317; RV64IA-WMO-ZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1 8318; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 8319; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB57_1 8320; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 8321; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 8322; RV64IA-WMO-ZACAS-NEXT: ret 8323; 8324; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_release: 8325; RV64IA-TSO-ZACAS: # %bb.0: 8326; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 8327; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 8328; RV64IA-TSO-ZACAS-NEXT: li a3, 255 8329; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 8330; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 8331; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 8332; RV64IA-TSO-ZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 8333; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 8334; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3 8335; RV64IA-TSO-ZACAS-NEXT: mv a5, a4 8336; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB57_3 8337; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1 8338; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1 8339; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 8340; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 8341; RV64IA-TSO-ZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1 8342; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 8343; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB57_1 8344; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 8345; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 8346; RV64IA-TSO-ZACAS-NEXT: ret 8347; 8348; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_release: 8349; RV64IA-WMO-ZABHA: # %bb.0: 8350; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.rl a0, a1, (a0) 8351; RV64IA-WMO-ZABHA-NEXT: ret 8352; 8353; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_release: 8354; RV64IA-TSO-ZABHA: # %bb.0: 8355; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0) 8356; RV64IA-TSO-ZABHA-NEXT: ret 8357 %1 = atomicrmw umax ptr %a, i8 %b release 8358 ret i8 %1 8359} 8360 8361define i8 @atomicrmw_umax_i8_acq_rel(ptr %a, i8 %b) nounwind { 8362; RV32I-LABEL: atomicrmw_umax_i8_acq_rel: 8363; RV32I: # %bb.0: 8364; RV32I-NEXT: addi sp, sp, -32 8365; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8366; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8367; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8368; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8369; RV32I-NEXT: mv s0, a0 8370; RV32I-NEXT: lbu a3, 0(a0) 8371; RV32I-NEXT: mv s1, a1 8372; RV32I-NEXT: andi s2, a1, 255 8373; RV32I-NEXT: j .LBB58_2 8374; RV32I-NEXT: .LBB58_1: # %atomicrmw.start 8375; RV32I-NEXT: # in Loop: Header=BB58_2 Depth=1 8376; RV32I-NEXT: sb a3, 15(sp) 8377; RV32I-NEXT: addi a1, sp, 15 8378; RV32I-NEXT: li a3, 4 8379; RV32I-NEXT: li a4, 2 8380; RV32I-NEXT: mv a0, s0 8381; RV32I-NEXT: call __atomic_compare_exchange_1 8382; RV32I-NEXT: lbu a3, 15(sp) 8383; RV32I-NEXT: bnez a0, .LBB58_4 8384; RV32I-NEXT: .LBB58_2: # %atomicrmw.start 8385; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8386; RV32I-NEXT: andi a0, a3, 255 8387; RV32I-NEXT: mv a2, a3 8388; RV32I-NEXT: bltu s2, a0, .LBB58_1 8389; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8390; RV32I-NEXT: # in Loop: Header=BB58_2 Depth=1 8391; RV32I-NEXT: mv a2, s1 8392; RV32I-NEXT: j .LBB58_1 8393; RV32I-NEXT: .LBB58_4: # %atomicrmw.end 8394; RV32I-NEXT: mv a0, a3 8395; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8396; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8397; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8398; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8399; RV32I-NEXT: addi sp, sp, 32 8400; RV32I-NEXT: ret 8401; 8402; RV32IA-WMO-LABEL: atomicrmw_umax_i8_acq_rel: 8403; RV32IA-WMO: # %bb.0: 8404; RV32IA-WMO-NEXT: andi a2, a0, -4 8405; RV32IA-WMO-NEXT: slli a0, a0, 3 8406; RV32IA-WMO-NEXT: li a3, 255 8407; RV32IA-WMO-NEXT: andi a1, a1, 255 8408; RV32IA-WMO-NEXT: sll a3, a3, a0 8409; RV32IA-WMO-NEXT: sll a1, a1, a0 8410; RV32IA-WMO-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 8411; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 8412; RV32IA-WMO-NEXT: and a6, a4, a3 8413; RV32IA-WMO-NEXT: mv a5, a4 8414; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB58_3 8415; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1 8416; RV32IA-WMO-NEXT: xor a5, a4, a1 8417; RV32IA-WMO-NEXT: and a5, a5, a3 8418; RV32IA-WMO-NEXT: xor a5, a4, a5 8419; RV32IA-WMO-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1 8420; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 8421; RV32IA-WMO-NEXT: bnez a5, .LBB58_1 8422; RV32IA-WMO-NEXT: # %bb.4: 8423; RV32IA-WMO-NEXT: srl a0, a4, a0 8424; RV32IA-WMO-NEXT: ret 8425; 8426; RV32IA-TSO-LABEL: atomicrmw_umax_i8_acq_rel: 8427; RV32IA-TSO: # %bb.0: 8428; RV32IA-TSO-NEXT: andi a2, a0, -4 8429; RV32IA-TSO-NEXT: slli a0, a0, 3 8430; RV32IA-TSO-NEXT: li a3, 255 8431; RV32IA-TSO-NEXT: andi a1, a1, 255 8432; RV32IA-TSO-NEXT: sll a3, a3, a0 8433; RV32IA-TSO-NEXT: sll a1, a1, a0 8434; RV32IA-TSO-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 8435; RV32IA-TSO-NEXT: lr.w a4, (a2) 8436; RV32IA-TSO-NEXT: and a6, a4, a3 8437; RV32IA-TSO-NEXT: mv a5, a4 8438; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB58_3 8439; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1 8440; RV32IA-TSO-NEXT: xor a5, a4, a1 8441; RV32IA-TSO-NEXT: and a5, a5, a3 8442; RV32IA-TSO-NEXT: xor a5, a4, a5 8443; RV32IA-TSO-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1 8444; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 8445; RV32IA-TSO-NEXT: bnez a5, .LBB58_1 8446; RV32IA-TSO-NEXT: # %bb.4: 8447; RV32IA-TSO-NEXT: srl a0, a4, a0 8448; RV32IA-TSO-NEXT: ret 8449; 8450; RV64I-LABEL: atomicrmw_umax_i8_acq_rel: 8451; RV64I: # %bb.0: 8452; RV64I-NEXT: addi sp, sp, -48 8453; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8454; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8455; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8456; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8457; RV64I-NEXT: mv s0, a0 8458; RV64I-NEXT: lbu a3, 0(a0) 8459; RV64I-NEXT: mv s1, a1 8460; RV64I-NEXT: andi s2, a1, 255 8461; RV64I-NEXT: j .LBB58_2 8462; RV64I-NEXT: .LBB58_1: # %atomicrmw.start 8463; RV64I-NEXT: # in Loop: Header=BB58_2 Depth=1 8464; RV64I-NEXT: sb a3, 15(sp) 8465; RV64I-NEXT: addi a1, sp, 15 8466; RV64I-NEXT: li a3, 4 8467; RV64I-NEXT: li a4, 2 8468; RV64I-NEXT: mv a0, s0 8469; RV64I-NEXT: call __atomic_compare_exchange_1 8470; RV64I-NEXT: lbu a3, 15(sp) 8471; RV64I-NEXT: bnez a0, .LBB58_4 8472; RV64I-NEXT: .LBB58_2: # %atomicrmw.start 8473; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8474; RV64I-NEXT: andi a0, a3, 255 8475; RV64I-NEXT: mv a2, a3 8476; RV64I-NEXT: bltu s2, a0, .LBB58_1 8477; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8478; RV64I-NEXT: # in Loop: Header=BB58_2 Depth=1 8479; RV64I-NEXT: mv a2, s1 8480; RV64I-NEXT: j .LBB58_1 8481; RV64I-NEXT: .LBB58_4: # %atomicrmw.end 8482; RV64I-NEXT: mv a0, a3 8483; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8484; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8485; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8486; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8487; RV64I-NEXT: addi sp, sp, 48 8488; RV64I-NEXT: ret 8489; 8490; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_acq_rel: 8491; RV64IA-WMO-NOZACAS: # %bb.0: 8492; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 8493; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 8494; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 8495; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 8496; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 8497; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 8498; RV64IA-WMO-NOZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 8499; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 8500; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3 8501; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4 8502; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB58_3 8503; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1 8504; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1 8505; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 8506; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 8507; RV64IA-WMO-NOZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1 8508; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 8509; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB58_1 8510; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 8511; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 8512; RV64IA-WMO-NOZACAS-NEXT: ret 8513; 8514; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_acq_rel: 8515; RV64IA-TSO-NOZACAS: # %bb.0: 8516; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 8517; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 8518; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 8519; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 8520; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 8521; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 8522; RV64IA-TSO-NOZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 8523; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 8524; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3 8525; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4 8526; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB58_3 8527; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1 8528; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1 8529; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 8530; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 8531; RV64IA-TSO-NOZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1 8532; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 8533; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB58_1 8534; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 8535; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 8536; RV64IA-TSO-NOZACAS-NEXT: ret 8537; 8538; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_acq_rel: 8539; RV64IA-WMO-ZACAS: # %bb.0: 8540; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 8541; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 8542; RV64IA-WMO-ZACAS-NEXT: li a3, 255 8543; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 8544; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 8545; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 8546; RV64IA-WMO-ZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 8547; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 8548; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3 8549; RV64IA-WMO-ZACAS-NEXT: mv a5, a4 8550; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB58_3 8551; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1 8552; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1 8553; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 8554; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 8555; RV64IA-WMO-ZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1 8556; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 8557; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB58_1 8558; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 8559; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 8560; RV64IA-WMO-ZACAS-NEXT: ret 8561; 8562; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_acq_rel: 8563; RV64IA-TSO-ZACAS: # %bb.0: 8564; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 8565; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 8566; RV64IA-TSO-ZACAS-NEXT: li a3, 255 8567; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 8568; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 8569; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 8570; RV64IA-TSO-ZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 8571; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 8572; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3 8573; RV64IA-TSO-ZACAS-NEXT: mv a5, a4 8574; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB58_3 8575; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1 8576; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1 8577; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 8578; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 8579; RV64IA-TSO-ZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1 8580; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 8581; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB58_1 8582; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 8583; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 8584; RV64IA-TSO-ZACAS-NEXT: ret 8585; 8586; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_acq_rel: 8587; RV64IA-WMO-ZABHA: # %bb.0: 8588; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.aqrl a0, a1, (a0) 8589; RV64IA-WMO-ZABHA-NEXT: ret 8590; 8591; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_acq_rel: 8592; RV64IA-TSO-ZABHA: # %bb.0: 8593; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0) 8594; RV64IA-TSO-ZABHA-NEXT: ret 8595 %1 = atomicrmw umax ptr %a, i8 %b acq_rel 8596 ret i8 %1 8597} 8598 8599define i8 @atomicrmw_umax_i8_seq_cst(ptr %a, i8 %b) nounwind { 8600; RV32I-LABEL: atomicrmw_umax_i8_seq_cst: 8601; RV32I: # %bb.0: 8602; RV32I-NEXT: addi sp, sp, -32 8603; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8604; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8605; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8606; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8607; RV32I-NEXT: mv s0, a0 8608; RV32I-NEXT: lbu a3, 0(a0) 8609; RV32I-NEXT: mv s1, a1 8610; RV32I-NEXT: andi s2, a1, 255 8611; RV32I-NEXT: j .LBB59_2 8612; RV32I-NEXT: .LBB59_1: # %atomicrmw.start 8613; RV32I-NEXT: # in Loop: Header=BB59_2 Depth=1 8614; RV32I-NEXT: sb a3, 15(sp) 8615; RV32I-NEXT: addi a1, sp, 15 8616; RV32I-NEXT: li a3, 5 8617; RV32I-NEXT: li a4, 5 8618; RV32I-NEXT: mv a0, s0 8619; RV32I-NEXT: call __atomic_compare_exchange_1 8620; RV32I-NEXT: lbu a3, 15(sp) 8621; RV32I-NEXT: bnez a0, .LBB59_4 8622; RV32I-NEXT: .LBB59_2: # %atomicrmw.start 8623; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8624; RV32I-NEXT: andi a0, a3, 255 8625; RV32I-NEXT: mv a2, a3 8626; RV32I-NEXT: bltu s2, a0, .LBB59_1 8627; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8628; RV32I-NEXT: # in Loop: Header=BB59_2 Depth=1 8629; RV32I-NEXT: mv a2, s1 8630; RV32I-NEXT: j .LBB59_1 8631; RV32I-NEXT: .LBB59_4: # %atomicrmw.end 8632; RV32I-NEXT: mv a0, a3 8633; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8634; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8635; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8636; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8637; RV32I-NEXT: addi sp, sp, 32 8638; RV32I-NEXT: ret 8639; 8640; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst: 8641; RV32IA: # %bb.0: 8642; RV32IA-NEXT: andi a2, a0, -4 8643; RV32IA-NEXT: slli a0, a0, 3 8644; RV32IA-NEXT: li a3, 255 8645; RV32IA-NEXT: andi a1, a1, 255 8646; RV32IA-NEXT: sll a3, a3, a0 8647; RV32IA-NEXT: sll a1, a1, a0 8648; RV32IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 8649; RV32IA-NEXT: lr.w.aqrl a4, (a2) 8650; RV32IA-NEXT: and a6, a4, a3 8651; RV32IA-NEXT: mv a5, a4 8652; RV32IA-NEXT: bgeu a6, a1, .LBB59_3 8653; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB59_1 Depth=1 8654; RV32IA-NEXT: xor a5, a4, a1 8655; RV32IA-NEXT: and a5, a5, a3 8656; RV32IA-NEXT: xor a5, a4, a5 8657; RV32IA-NEXT: .LBB59_3: # in Loop: Header=BB59_1 Depth=1 8658; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 8659; RV32IA-NEXT: bnez a5, .LBB59_1 8660; RV32IA-NEXT: # %bb.4: 8661; RV32IA-NEXT: srl a0, a4, a0 8662; RV32IA-NEXT: ret 8663; 8664; RV64I-LABEL: atomicrmw_umax_i8_seq_cst: 8665; RV64I: # %bb.0: 8666; RV64I-NEXT: addi sp, sp, -48 8667; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8668; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8669; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8670; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8671; RV64I-NEXT: mv s0, a0 8672; RV64I-NEXT: lbu a3, 0(a0) 8673; RV64I-NEXT: mv s1, a1 8674; RV64I-NEXT: andi s2, a1, 255 8675; RV64I-NEXT: j .LBB59_2 8676; RV64I-NEXT: .LBB59_1: # %atomicrmw.start 8677; RV64I-NEXT: # in Loop: Header=BB59_2 Depth=1 8678; RV64I-NEXT: sb a3, 15(sp) 8679; RV64I-NEXT: addi a1, sp, 15 8680; RV64I-NEXT: li a3, 5 8681; RV64I-NEXT: li a4, 5 8682; RV64I-NEXT: mv a0, s0 8683; RV64I-NEXT: call __atomic_compare_exchange_1 8684; RV64I-NEXT: lbu a3, 15(sp) 8685; RV64I-NEXT: bnez a0, .LBB59_4 8686; RV64I-NEXT: .LBB59_2: # %atomicrmw.start 8687; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8688; RV64I-NEXT: andi a0, a3, 255 8689; RV64I-NEXT: mv a2, a3 8690; RV64I-NEXT: bltu s2, a0, .LBB59_1 8691; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8692; RV64I-NEXT: # in Loop: Header=BB59_2 Depth=1 8693; RV64I-NEXT: mv a2, s1 8694; RV64I-NEXT: j .LBB59_1 8695; RV64I-NEXT: .LBB59_4: # %atomicrmw.end 8696; RV64I-NEXT: mv a0, a3 8697; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8698; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8699; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8700; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8701; RV64I-NEXT: addi sp, sp, 48 8702; RV64I-NEXT: ret 8703; 8704; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i8_seq_cst: 8705; RV64IA-NOZACAS: # %bb.0: 8706; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 8707; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 8708; RV64IA-NOZACAS-NEXT: li a3, 255 8709; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 8710; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 8711; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 8712; RV64IA-NOZACAS-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 8713; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 8714; RV64IA-NOZACAS-NEXT: and a6, a4, a3 8715; RV64IA-NOZACAS-NEXT: mv a5, a4 8716; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB59_3 8717; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB59_1 Depth=1 8718; RV64IA-NOZACAS-NEXT: xor a5, a4, a1 8719; RV64IA-NOZACAS-NEXT: and a5, a5, a3 8720; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 8721; RV64IA-NOZACAS-NEXT: .LBB59_3: # in Loop: Header=BB59_1 Depth=1 8722; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 8723; RV64IA-NOZACAS-NEXT: bnez a5, .LBB59_1 8724; RV64IA-NOZACAS-NEXT: # %bb.4: 8725; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 8726; RV64IA-NOZACAS-NEXT: ret 8727; 8728; RV64IA-ZACAS-LABEL: atomicrmw_umax_i8_seq_cst: 8729; RV64IA-ZACAS: # %bb.0: 8730; RV64IA-ZACAS-NEXT: andi a2, a0, -4 8731; RV64IA-ZACAS-NEXT: slli a0, a0, 3 8732; RV64IA-ZACAS-NEXT: li a3, 255 8733; RV64IA-ZACAS-NEXT: andi a1, a1, 255 8734; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 8735; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 8736; RV64IA-ZACAS-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 8737; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2) 8738; RV64IA-ZACAS-NEXT: and a6, a4, a3 8739; RV64IA-ZACAS-NEXT: mv a5, a4 8740; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB59_3 8741; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB59_1 Depth=1 8742; RV64IA-ZACAS-NEXT: xor a5, a4, a1 8743; RV64IA-ZACAS-NEXT: and a5, a5, a3 8744; RV64IA-ZACAS-NEXT: xor a5, a4, a5 8745; RV64IA-ZACAS-NEXT: .LBB59_3: # in Loop: Header=BB59_1 Depth=1 8746; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 8747; RV64IA-ZACAS-NEXT: bnez a5, .LBB59_1 8748; RV64IA-ZACAS-NEXT: # %bb.4: 8749; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 8750; RV64IA-ZACAS-NEXT: ret 8751; 8752; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_seq_cst: 8753; RV64IA-WMO-ZABHA: # %bb.0: 8754; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.aqrl a0, a1, (a0) 8755; RV64IA-WMO-ZABHA-NEXT: ret 8756; 8757; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_seq_cst: 8758; RV64IA-TSO-ZABHA: # %bb.0: 8759; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0) 8760; RV64IA-TSO-ZABHA-NEXT: ret 8761 %1 = atomicrmw umax ptr %a, i8 %b seq_cst 8762 ret i8 %1 8763} 8764 8765define i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind { 8766; RV32I-LABEL: atomicrmw_umin_i8_monotonic: 8767; RV32I: # %bb.0: 8768; RV32I-NEXT: addi sp, sp, -32 8769; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8770; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8771; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8772; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8773; RV32I-NEXT: mv s0, a0 8774; RV32I-NEXT: lbu a3, 0(a0) 8775; RV32I-NEXT: mv s1, a1 8776; RV32I-NEXT: andi s2, a1, 255 8777; RV32I-NEXT: j .LBB60_2 8778; RV32I-NEXT: .LBB60_1: # %atomicrmw.start 8779; RV32I-NEXT: # in Loop: Header=BB60_2 Depth=1 8780; RV32I-NEXT: sb a3, 15(sp) 8781; RV32I-NEXT: addi a1, sp, 15 8782; RV32I-NEXT: mv a0, s0 8783; RV32I-NEXT: li a3, 0 8784; RV32I-NEXT: li a4, 0 8785; RV32I-NEXT: call __atomic_compare_exchange_1 8786; RV32I-NEXT: lbu a3, 15(sp) 8787; RV32I-NEXT: bnez a0, .LBB60_4 8788; RV32I-NEXT: .LBB60_2: # %atomicrmw.start 8789; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8790; RV32I-NEXT: andi a0, a3, 255 8791; RV32I-NEXT: mv a2, a3 8792; RV32I-NEXT: bgeu s2, a0, .LBB60_1 8793; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8794; RV32I-NEXT: # in Loop: Header=BB60_2 Depth=1 8795; RV32I-NEXT: mv a2, s1 8796; RV32I-NEXT: j .LBB60_1 8797; RV32I-NEXT: .LBB60_4: # %atomicrmw.end 8798; RV32I-NEXT: mv a0, a3 8799; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8800; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8801; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8802; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8803; RV32I-NEXT: addi sp, sp, 32 8804; RV32I-NEXT: ret 8805; 8806; RV32IA-LABEL: atomicrmw_umin_i8_monotonic: 8807; RV32IA: # %bb.0: 8808; RV32IA-NEXT: andi a2, a0, -4 8809; RV32IA-NEXT: slli a0, a0, 3 8810; RV32IA-NEXT: li a3, 255 8811; RV32IA-NEXT: andi a1, a1, 255 8812; RV32IA-NEXT: sll a3, a3, a0 8813; RV32IA-NEXT: sll a1, a1, a0 8814; RV32IA-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 8815; RV32IA-NEXT: lr.w a4, (a2) 8816; RV32IA-NEXT: and a6, a4, a3 8817; RV32IA-NEXT: mv a5, a4 8818; RV32IA-NEXT: bgeu a1, a6, .LBB60_3 8819; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB60_1 Depth=1 8820; RV32IA-NEXT: xor a5, a4, a1 8821; RV32IA-NEXT: and a5, a5, a3 8822; RV32IA-NEXT: xor a5, a4, a5 8823; RV32IA-NEXT: .LBB60_3: # in Loop: Header=BB60_1 Depth=1 8824; RV32IA-NEXT: sc.w a5, a5, (a2) 8825; RV32IA-NEXT: bnez a5, .LBB60_1 8826; RV32IA-NEXT: # %bb.4: 8827; RV32IA-NEXT: srl a0, a4, a0 8828; RV32IA-NEXT: ret 8829; 8830; RV64I-LABEL: atomicrmw_umin_i8_monotonic: 8831; RV64I: # %bb.0: 8832; RV64I-NEXT: addi sp, sp, -48 8833; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 8834; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 8835; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 8836; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 8837; RV64I-NEXT: mv s0, a0 8838; RV64I-NEXT: lbu a3, 0(a0) 8839; RV64I-NEXT: mv s1, a1 8840; RV64I-NEXT: andi s2, a1, 255 8841; RV64I-NEXT: j .LBB60_2 8842; RV64I-NEXT: .LBB60_1: # %atomicrmw.start 8843; RV64I-NEXT: # in Loop: Header=BB60_2 Depth=1 8844; RV64I-NEXT: sb a3, 15(sp) 8845; RV64I-NEXT: addi a1, sp, 15 8846; RV64I-NEXT: mv a0, s0 8847; RV64I-NEXT: li a3, 0 8848; RV64I-NEXT: li a4, 0 8849; RV64I-NEXT: call __atomic_compare_exchange_1 8850; RV64I-NEXT: lbu a3, 15(sp) 8851; RV64I-NEXT: bnez a0, .LBB60_4 8852; RV64I-NEXT: .LBB60_2: # %atomicrmw.start 8853; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 8854; RV64I-NEXT: andi a0, a3, 255 8855; RV64I-NEXT: mv a2, a3 8856; RV64I-NEXT: bgeu s2, a0, .LBB60_1 8857; RV64I-NEXT: # %bb.3: # %atomicrmw.start 8858; RV64I-NEXT: # in Loop: Header=BB60_2 Depth=1 8859; RV64I-NEXT: mv a2, s1 8860; RV64I-NEXT: j .LBB60_1 8861; RV64I-NEXT: .LBB60_4: # %atomicrmw.end 8862; RV64I-NEXT: mv a0, a3 8863; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 8864; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 8865; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 8866; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 8867; RV64I-NEXT: addi sp, sp, 48 8868; RV64I-NEXT: ret 8869; 8870; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i8_monotonic: 8871; RV64IA-NOZACAS: # %bb.0: 8872; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 8873; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 8874; RV64IA-NOZACAS-NEXT: li a3, 255 8875; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 8876; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 8877; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 8878; RV64IA-NOZACAS-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 8879; RV64IA-NOZACAS-NEXT: lr.w a4, (a2) 8880; RV64IA-NOZACAS-NEXT: and a6, a4, a3 8881; RV64IA-NOZACAS-NEXT: mv a5, a4 8882; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB60_3 8883; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB60_1 Depth=1 8884; RV64IA-NOZACAS-NEXT: xor a5, a4, a1 8885; RV64IA-NOZACAS-NEXT: and a5, a5, a3 8886; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 8887; RV64IA-NOZACAS-NEXT: .LBB60_3: # in Loop: Header=BB60_1 Depth=1 8888; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 8889; RV64IA-NOZACAS-NEXT: bnez a5, .LBB60_1 8890; RV64IA-NOZACAS-NEXT: # %bb.4: 8891; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 8892; RV64IA-NOZACAS-NEXT: ret 8893; 8894; RV64IA-ZACAS-LABEL: atomicrmw_umin_i8_monotonic: 8895; RV64IA-ZACAS: # %bb.0: 8896; RV64IA-ZACAS-NEXT: andi a2, a0, -4 8897; RV64IA-ZACAS-NEXT: slli a0, a0, 3 8898; RV64IA-ZACAS-NEXT: li a3, 255 8899; RV64IA-ZACAS-NEXT: andi a1, a1, 255 8900; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 8901; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 8902; RV64IA-ZACAS-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1 8903; RV64IA-ZACAS-NEXT: lr.w a4, (a2) 8904; RV64IA-ZACAS-NEXT: and a6, a4, a3 8905; RV64IA-ZACAS-NEXT: mv a5, a4 8906; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB60_3 8907; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB60_1 Depth=1 8908; RV64IA-ZACAS-NEXT: xor a5, a4, a1 8909; RV64IA-ZACAS-NEXT: and a5, a5, a3 8910; RV64IA-ZACAS-NEXT: xor a5, a4, a5 8911; RV64IA-ZACAS-NEXT: .LBB60_3: # in Loop: Header=BB60_1 Depth=1 8912; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 8913; RV64IA-ZACAS-NEXT: bnez a5, .LBB60_1 8914; RV64IA-ZACAS-NEXT: # %bb.4: 8915; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 8916; RV64IA-ZACAS-NEXT: ret 8917; 8918; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_monotonic: 8919; RV64IA-WMO-ZABHA: # %bb.0: 8920; RV64IA-WMO-ZABHA-NEXT: amominu.b a0, a1, (a0) 8921; RV64IA-WMO-ZABHA-NEXT: ret 8922; 8923; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_monotonic: 8924; RV64IA-TSO-ZABHA: # %bb.0: 8925; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0) 8926; RV64IA-TSO-ZABHA-NEXT: ret 8927 %1 = atomicrmw umin ptr %a, i8 %b monotonic 8928 ret i8 %1 8929} 8930 8931define i8 @atomicrmw_umin_i8_acquire(ptr %a, i8 %b) nounwind { 8932; RV32I-LABEL: atomicrmw_umin_i8_acquire: 8933; RV32I: # %bb.0: 8934; RV32I-NEXT: addi sp, sp, -32 8935; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8936; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8937; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8938; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8939; RV32I-NEXT: mv s0, a0 8940; RV32I-NEXT: lbu a3, 0(a0) 8941; RV32I-NEXT: mv s1, a1 8942; RV32I-NEXT: andi s2, a1, 255 8943; RV32I-NEXT: j .LBB61_2 8944; RV32I-NEXT: .LBB61_1: # %atomicrmw.start 8945; RV32I-NEXT: # in Loop: Header=BB61_2 Depth=1 8946; RV32I-NEXT: sb a3, 15(sp) 8947; RV32I-NEXT: addi a1, sp, 15 8948; RV32I-NEXT: li a3, 2 8949; RV32I-NEXT: li a4, 2 8950; RV32I-NEXT: mv a0, s0 8951; RV32I-NEXT: call __atomic_compare_exchange_1 8952; RV32I-NEXT: lbu a3, 15(sp) 8953; RV32I-NEXT: bnez a0, .LBB61_4 8954; RV32I-NEXT: .LBB61_2: # %atomicrmw.start 8955; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8956; RV32I-NEXT: andi a0, a3, 255 8957; RV32I-NEXT: mv a2, a3 8958; RV32I-NEXT: bgeu s2, a0, .LBB61_1 8959; RV32I-NEXT: # %bb.3: # %atomicrmw.start 8960; RV32I-NEXT: # in Loop: Header=BB61_2 Depth=1 8961; RV32I-NEXT: mv a2, s1 8962; RV32I-NEXT: j .LBB61_1 8963; RV32I-NEXT: .LBB61_4: # %atomicrmw.end 8964; RV32I-NEXT: mv a0, a3 8965; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8966; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8967; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8968; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 8969; RV32I-NEXT: addi sp, sp, 32 8970; RV32I-NEXT: ret 8971; 8972; RV32IA-WMO-LABEL: atomicrmw_umin_i8_acquire: 8973; RV32IA-WMO: # %bb.0: 8974; RV32IA-WMO-NEXT: andi a2, a0, -4 8975; RV32IA-WMO-NEXT: slli a0, a0, 3 8976; RV32IA-WMO-NEXT: li a3, 255 8977; RV32IA-WMO-NEXT: andi a1, a1, 255 8978; RV32IA-WMO-NEXT: sll a3, a3, a0 8979; RV32IA-WMO-NEXT: sll a1, a1, a0 8980; RV32IA-WMO-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 8981; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 8982; RV32IA-WMO-NEXT: and a6, a4, a3 8983; RV32IA-WMO-NEXT: mv a5, a4 8984; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB61_3 8985; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1 8986; RV32IA-WMO-NEXT: xor a5, a4, a1 8987; RV32IA-WMO-NEXT: and a5, a5, a3 8988; RV32IA-WMO-NEXT: xor a5, a4, a5 8989; RV32IA-WMO-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1 8990; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 8991; RV32IA-WMO-NEXT: bnez a5, .LBB61_1 8992; RV32IA-WMO-NEXT: # %bb.4: 8993; RV32IA-WMO-NEXT: srl a0, a4, a0 8994; RV32IA-WMO-NEXT: ret 8995; 8996; RV32IA-TSO-LABEL: atomicrmw_umin_i8_acquire: 8997; RV32IA-TSO: # %bb.0: 8998; RV32IA-TSO-NEXT: andi a2, a0, -4 8999; RV32IA-TSO-NEXT: slli a0, a0, 3 9000; RV32IA-TSO-NEXT: li a3, 255 9001; RV32IA-TSO-NEXT: andi a1, a1, 255 9002; RV32IA-TSO-NEXT: sll a3, a3, a0 9003; RV32IA-TSO-NEXT: sll a1, a1, a0 9004; RV32IA-TSO-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 9005; RV32IA-TSO-NEXT: lr.w a4, (a2) 9006; RV32IA-TSO-NEXT: and a6, a4, a3 9007; RV32IA-TSO-NEXT: mv a5, a4 9008; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB61_3 9009; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1 9010; RV32IA-TSO-NEXT: xor a5, a4, a1 9011; RV32IA-TSO-NEXT: and a5, a5, a3 9012; RV32IA-TSO-NEXT: xor a5, a4, a5 9013; RV32IA-TSO-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1 9014; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 9015; RV32IA-TSO-NEXT: bnez a5, .LBB61_1 9016; RV32IA-TSO-NEXT: # %bb.4: 9017; RV32IA-TSO-NEXT: srl a0, a4, a0 9018; RV32IA-TSO-NEXT: ret 9019; 9020; RV64I-LABEL: atomicrmw_umin_i8_acquire: 9021; RV64I: # %bb.0: 9022; RV64I-NEXT: addi sp, sp, -48 9023; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9024; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9025; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9026; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9027; RV64I-NEXT: mv s0, a0 9028; RV64I-NEXT: lbu a3, 0(a0) 9029; RV64I-NEXT: mv s1, a1 9030; RV64I-NEXT: andi s2, a1, 255 9031; RV64I-NEXT: j .LBB61_2 9032; RV64I-NEXT: .LBB61_1: # %atomicrmw.start 9033; RV64I-NEXT: # in Loop: Header=BB61_2 Depth=1 9034; RV64I-NEXT: sb a3, 15(sp) 9035; RV64I-NEXT: addi a1, sp, 15 9036; RV64I-NEXT: li a3, 2 9037; RV64I-NEXT: li a4, 2 9038; RV64I-NEXT: mv a0, s0 9039; RV64I-NEXT: call __atomic_compare_exchange_1 9040; RV64I-NEXT: lbu a3, 15(sp) 9041; RV64I-NEXT: bnez a0, .LBB61_4 9042; RV64I-NEXT: .LBB61_2: # %atomicrmw.start 9043; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9044; RV64I-NEXT: andi a0, a3, 255 9045; RV64I-NEXT: mv a2, a3 9046; RV64I-NEXT: bgeu s2, a0, .LBB61_1 9047; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9048; RV64I-NEXT: # in Loop: Header=BB61_2 Depth=1 9049; RV64I-NEXT: mv a2, s1 9050; RV64I-NEXT: j .LBB61_1 9051; RV64I-NEXT: .LBB61_4: # %atomicrmw.end 9052; RV64I-NEXT: mv a0, a3 9053; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9054; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9055; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9056; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9057; RV64I-NEXT: addi sp, sp, 48 9058; RV64I-NEXT: ret 9059; 9060; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_acquire: 9061; RV64IA-WMO-NOZACAS: # %bb.0: 9062; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 9063; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 9064; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 9065; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 9066; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 9067; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 9068; RV64IA-WMO-NOZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 9069; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 9070; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3 9071; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4 9072; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB61_3 9073; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1 9074; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1 9075; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 9076; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 9077; RV64IA-WMO-NOZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1 9078; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 9079; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB61_1 9080; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 9081; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 9082; RV64IA-WMO-NOZACAS-NEXT: ret 9083; 9084; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_acquire: 9085; RV64IA-TSO-NOZACAS: # %bb.0: 9086; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 9087; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 9088; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 9089; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 9090; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 9091; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 9092; RV64IA-TSO-NOZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 9093; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 9094; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3 9095; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4 9096; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB61_3 9097; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1 9098; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1 9099; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 9100; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 9101; RV64IA-TSO-NOZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1 9102; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 9103; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB61_1 9104; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 9105; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 9106; RV64IA-TSO-NOZACAS-NEXT: ret 9107; 9108; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_acquire: 9109; RV64IA-WMO-ZACAS: # %bb.0: 9110; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 9111; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 9112; RV64IA-WMO-ZACAS-NEXT: li a3, 255 9113; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 9114; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 9115; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 9116; RV64IA-WMO-ZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 9117; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 9118; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3 9119; RV64IA-WMO-ZACAS-NEXT: mv a5, a4 9120; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB61_3 9121; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1 9122; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1 9123; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 9124; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 9125; RV64IA-WMO-ZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1 9126; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 9127; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB61_1 9128; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 9129; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 9130; RV64IA-WMO-ZACAS-NEXT: ret 9131; 9132; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_acquire: 9133; RV64IA-TSO-ZACAS: # %bb.0: 9134; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 9135; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 9136; RV64IA-TSO-ZACAS-NEXT: li a3, 255 9137; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 9138; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 9139; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 9140; RV64IA-TSO-ZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1 9141; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 9142; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3 9143; RV64IA-TSO-ZACAS-NEXT: mv a5, a4 9144; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB61_3 9145; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1 9146; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1 9147; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 9148; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 9149; RV64IA-TSO-ZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1 9150; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 9151; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB61_1 9152; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 9153; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 9154; RV64IA-TSO-ZACAS-NEXT: ret 9155; 9156; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_acquire: 9157; RV64IA-WMO-ZABHA: # %bb.0: 9158; RV64IA-WMO-ZABHA-NEXT: amominu.b.aq a0, a1, (a0) 9159; RV64IA-WMO-ZABHA-NEXT: ret 9160; 9161; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_acquire: 9162; RV64IA-TSO-ZABHA: # %bb.0: 9163; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0) 9164; RV64IA-TSO-ZABHA-NEXT: ret 9165 %1 = atomicrmw umin ptr %a, i8 %b acquire 9166 ret i8 %1 9167} 9168 9169define i8 @atomicrmw_umin_i8_release(ptr %a, i8 %b) nounwind { 9170; RV32I-LABEL: atomicrmw_umin_i8_release: 9171; RV32I: # %bb.0: 9172; RV32I-NEXT: addi sp, sp, -32 9173; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9174; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9175; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9176; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9177; RV32I-NEXT: mv s0, a0 9178; RV32I-NEXT: lbu a3, 0(a0) 9179; RV32I-NEXT: mv s1, a1 9180; RV32I-NEXT: andi s2, a1, 255 9181; RV32I-NEXT: j .LBB62_2 9182; RV32I-NEXT: .LBB62_1: # %atomicrmw.start 9183; RV32I-NEXT: # in Loop: Header=BB62_2 Depth=1 9184; RV32I-NEXT: sb a3, 15(sp) 9185; RV32I-NEXT: addi a1, sp, 15 9186; RV32I-NEXT: li a3, 3 9187; RV32I-NEXT: mv a0, s0 9188; RV32I-NEXT: li a4, 0 9189; RV32I-NEXT: call __atomic_compare_exchange_1 9190; RV32I-NEXT: lbu a3, 15(sp) 9191; RV32I-NEXT: bnez a0, .LBB62_4 9192; RV32I-NEXT: .LBB62_2: # %atomicrmw.start 9193; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9194; RV32I-NEXT: andi a0, a3, 255 9195; RV32I-NEXT: mv a2, a3 9196; RV32I-NEXT: bgeu s2, a0, .LBB62_1 9197; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9198; RV32I-NEXT: # in Loop: Header=BB62_2 Depth=1 9199; RV32I-NEXT: mv a2, s1 9200; RV32I-NEXT: j .LBB62_1 9201; RV32I-NEXT: .LBB62_4: # %atomicrmw.end 9202; RV32I-NEXT: mv a0, a3 9203; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9204; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9205; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9206; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9207; RV32I-NEXT: addi sp, sp, 32 9208; RV32I-NEXT: ret 9209; 9210; RV32IA-WMO-LABEL: atomicrmw_umin_i8_release: 9211; RV32IA-WMO: # %bb.0: 9212; RV32IA-WMO-NEXT: andi a2, a0, -4 9213; RV32IA-WMO-NEXT: slli a0, a0, 3 9214; RV32IA-WMO-NEXT: li a3, 255 9215; RV32IA-WMO-NEXT: andi a1, a1, 255 9216; RV32IA-WMO-NEXT: sll a3, a3, a0 9217; RV32IA-WMO-NEXT: sll a1, a1, a0 9218; RV32IA-WMO-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 9219; RV32IA-WMO-NEXT: lr.w a4, (a2) 9220; RV32IA-WMO-NEXT: and a6, a4, a3 9221; RV32IA-WMO-NEXT: mv a5, a4 9222; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB62_3 9223; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1 9224; RV32IA-WMO-NEXT: xor a5, a4, a1 9225; RV32IA-WMO-NEXT: and a5, a5, a3 9226; RV32IA-WMO-NEXT: xor a5, a4, a5 9227; RV32IA-WMO-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1 9228; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 9229; RV32IA-WMO-NEXT: bnez a5, .LBB62_1 9230; RV32IA-WMO-NEXT: # %bb.4: 9231; RV32IA-WMO-NEXT: srl a0, a4, a0 9232; RV32IA-WMO-NEXT: ret 9233; 9234; RV32IA-TSO-LABEL: atomicrmw_umin_i8_release: 9235; RV32IA-TSO: # %bb.0: 9236; RV32IA-TSO-NEXT: andi a2, a0, -4 9237; RV32IA-TSO-NEXT: slli a0, a0, 3 9238; RV32IA-TSO-NEXT: li a3, 255 9239; RV32IA-TSO-NEXT: andi a1, a1, 255 9240; RV32IA-TSO-NEXT: sll a3, a3, a0 9241; RV32IA-TSO-NEXT: sll a1, a1, a0 9242; RV32IA-TSO-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 9243; RV32IA-TSO-NEXT: lr.w a4, (a2) 9244; RV32IA-TSO-NEXT: and a6, a4, a3 9245; RV32IA-TSO-NEXT: mv a5, a4 9246; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB62_3 9247; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1 9248; RV32IA-TSO-NEXT: xor a5, a4, a1 9249; RV32IA-TSO-NEXT: and a5, a5, a3 9250; RV32IA-TSO-NEXT: xor a5, a4, a5 9251; RV32IA-TSO-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1 9252; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 9253; RV32IA-TSO-NEXT: bnez a5, .LBB62_1 9254; RV32IA-TSO-NEXT: # %bb.4: 9255; RV32IA-TSO-NEXT: srl a0, a4, a0 9256; RV32IA-TSO-NEXT: ret 9257; 9258; RV64I-LABEL: atomicrmw_umin_i8_release: 9259; RV64I: # %bb.0: 9260; RV64I-NEXT: addi sp, sp, -48 9261; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9262; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9263; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9264; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9265; RV64I-NEXT: mv s0, a0 9266; RV64I-NEXT: lbu a3, 0(a0) 9267; RV64I-NEXT: mv s1, a1 9268; RV64I-NEXT: andi s2, a1, 255 9269; RV64I-NEXT: j .LBB62_2 9270; RV64I-NEXT: .LBB62_1: # %atomicrmw.start 9271; RV64I-NEXT: # in Loop: Header=BB62_2 Depth=1 9272; RV64I-NEXT: sb a3, 15(sp) 9273; RV64I-NEXT: addi a1, sp, 15 9274; RV64I-NEXT: li a3, 3 9275; RV64I-NEXT: mv a0, s0 9276; RV64I-NEXT: li a4, 0 9277; RV64I-NEXT: call __atomic_compare_exchange_1 9278; RV64I-NEXT: lbu a3, 15(sp) 9279; RV64I-NEXT: bnez a0, .LBB62_4 9280; RV64I-NEXT: .LBB62_2: # %atomicrmw.start 9281; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9282; RV64I-NEXT: andi a0, a3, 255 9283; RV64I-NEXT: mv a2, a3 9284; RV64I-NEXT: bgeu s2, a0, .LBB62_1 9285; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9286; RV64I-NEXT: # in Loop: Header=BB62_2 Depth=1 9287; RV64I-NEXT: mv a2, s1 9288; RV64I-NEXT: j .LBB62_1 9289; RV64I-NEXT: .LBB62_4: # %atomicrmw.end 9290; RV64I-NEXT: mv a0, a3 9291; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9292; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9293; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9294; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9295; RV64I-NEXT: addi sp, sp, 48 9296; RV64I-NEXT: ret 9297; 9298; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_release: 9299; RV64IA-WMO-NOZACAS: # %bb.0: 9300; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 9301; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 9302; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 9303; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 9304; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 9305; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 9306; RV64IA-WMO-NOZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 9307; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2) 9308; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3 9309; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4 9310; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB62_3 9311; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1 9312; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1 9313; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 9314; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 9315; RV64IA-WMO-NOZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1 9316; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 9317; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB62_1 9318; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 9319; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 9320; RV64IA-WMO-NOZACAS-NEXT: ret 9321; 9322; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_release: 9323; RV64IA-TSO-NOZACAS: # %bb.0: 9324; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 9325; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 9326; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 9327; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 9328; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 9329; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 9330; RV64IA-TSO-NOZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 9331; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 9332; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3 9333; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4 9334; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB62_3 9335; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1 9336; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1 9337; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 9338; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 9339; RV64IA-TSO-NOZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1 9340; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 9341; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB62_1 9342; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 9343; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 9344; RV64IA-TSO-NOZACAS-NEXT: ret 9345; 9346; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_release: 9347; RV64IA-WMO-ZACAS: # %bb.0: 9348; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 9349; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 9350; RV64IA-WMO-ZACAS-NEXT: li a3, 255 9351; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 9352; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 9353; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 9354; RV64IA-WMO-ZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 9355; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2) 9356; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3 9357; RV64IA-WMO-ZACAS-NEXT: mv a5, a4 9358; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB62_3 9359; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1 9360; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1 9361; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 9362; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 9363; RV64IA-WMO-ZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1 9364; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 9365; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB62_1 9366; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 9367; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 9368; RV64IA-WMO-ZACAS-NEXT: ret 9369; 9370; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_release: 9371; RV64IA-TSO-ZACAS: # %bb.0: 9372; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 9373; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 9374; RV64IA-TSO-ZACAS-NEXT: li a3, 255 9375; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 9376; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 9377; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 9378; RV64IA-TSO-ZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1 9379; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 9380; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3 9381; RV64IA-TSO-ZACAS-NEXT: mv a5, a4 9382; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB62_3 9383; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1 9384; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1 9385; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 9386; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 9387; RV64IA-TSO-ZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1 9388; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 9389; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB62_1 9390; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 9391; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 9392; RV64IA-TSO-ZACAS-NEXT: ret 9393; 9394; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_release: 9395; RV64IA-WMO-ZABHA: # %bb.0: 9396; RV64IA-WMO-ZABHA-NEXT: amominu.b.rl a0, a1, (a0) 9397; RV64IA-WMO-ZABHA-NEXT: ret 9398; 9399; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_release: 9400; RV64IA-TSO-ZABHA: # %bb.0: 9401; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0) 9402; RV64IA-TSO-ZABHA-NEXT: ret 9403 %1 = atomicrmw umin ptr %a, i8 %b release 9404 ret i8 %1 9405} 9406 9407define i8 @atomicrmw_umin_i8_acq_rel(ptr %a, i8 %b) nounwind { 9408; RV32I-LABEL: atomicrmw_umin_i8_acq_rel: 9409; RV32I: # %bb.0: 9410; RV32I-NEXT: addi sp, sp, -32 9411; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9412; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9413; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9414; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9415; RV32I-NEXT: mv s0, a0 9416; RV32I-NEXT: lbu a3, 0(a0) 9417; RV32I-NEXT: mv s1, a1 9418; RV32I-NEXT: andi s2, a1, 255 9419; RV32I-NEXT: j .LBB63_2 9420; RV32I-NEXT: .LBB63_1: # %atomicrmw.start 9421; RV32I-NEXT: # in Loop: Header=BB63_2 Depth=1 9422; RV32I-NEXT: sb a3, 15(sp) 9423; RV32I-NEXT: addi a1, sp, 15 9424; RV32I-NEXT: li a3, 4 9425; RV32I-NEXT: li a4, 2 9426; RV32I-NEXT: mv a0, s0 9427; RV32I-NEXT: call __atomic_compare_exchange_1 9428; RV32I-NEXT: lbu a3, 15(sp) 9429; RV32I-NEXT: bnez a0, .LBB63_4 9430; RV32I-NEXT: .LBB63_2: # %atomicrmw.start 9431; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9432; RV32I-NEXT: andi a0, a3, 255 9433; RV32I-NEXT: mv a2, a3 9434; RV32I-NEXT: bgeu s2, a0, .LBB63_1 9435; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9436; RV32I-NEXT: # in Loop: Header=BB63_2 Depth=1 9437; RV32I-NEXT: mv a2, s1 9438; RV32I-NEXT: j .LBB63_1 9439; RV32I-NEXT: .LBB63_4: # %atomicrmw.end 9440; RV32I-NEXT: mv a0, a3 9441; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9442; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9443; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9444; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9445; RV32I-NEXT: addi sp, sp, 32 9446; RV32I-NEXT: ret 9447; 9448; RV32IA-WMO-LABEL: atomicrmw_umin_i8_acq_rel: 9449; RV32IA-WMO: # %bb.0: 9450; RV32IA-WMO-NEXT: andi a2, a0, -4 9451; RV32IA-WMO-NEXT: slli a0, a0, 3 9452; RV32IA-WMO-NEXT: li a3, 255 9453; RV32IA-WMO-NEXT: andi a1, a1, 255 9454; RV32IA-WMO-NEXT: sll a3, a3, a0 9455; RV32IA-WMO-NEXT: sll a1, a1, a0 9456; RV32IA-WMO-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 9457; RV32IA-WMO-NEXT: lr.w.aq a4, (a2) 9458; RV32IA-WMO-NEXT: and a6, a4, a3 9459; RV32IA-WMO-NEXT: mv a5, a4 9460; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB63_3 9461; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1 9462; RV32IA-WMO-NEXT: xor a5, a4, a1 9463; RV32IA-WMO-NEXT: and a5, a5, a3 9464; RV32IA-WMO-NEXT: xor a5, a4, a5 9465; RV32IA-WMO-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1 9466; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 9467; RV32IA-WMO-NEXT: bnez a5, .LBB63_1 9468; RV32IA-WMO-NEXT: # %bb.4: 9469; RV32IA-WMO-NEXT: srl a0, a4, a0 9470; RV32IA-WMO-NEXT: ret 9471; 9472; RV32IA-TSO-LABEL: atomicrmw_umin_i8_acq_rel: 9473; RV32IA-TSO: # %bb.0: 9474; RV32IA-TSO-NEXT: andi a2, a0, -4 9475; RV32IA-TSO-NEXT: slli a0, a0, 3 9476; RV32IA-TSO-NEXT: li a3, 255 9477; RV32IA-TSO-NEXT: andi a1, a1, 255 9478; RV32IA-TSO-NEXT: sll a3, a3, a0 9479; RV32IA-TSO-NEXT: sll a1, a1, a0 9480; RV32IA-TSO-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 9481; RV32IA-TSO-NEXT: lr.w a4, (a2) 9482; RV32IA-TSO-NEXT: and a6, a4, a3 9483; RV32IA-TSO-NEXT: mv a5, a4 9484; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB63_3 9485; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1 9486; RV32IA-TSO-NEXT: xor a5, a4, a1 9487; RV32IA-TSO-NEXT: and a5, a5, a3 9488; RV32IA-TSO-NEXT: xor a5, a4, a5 9489; RV32IA-TSO-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1 9490; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 9491; RV32IA-TSO-NEXT: bnez a5, .LBB63_1 9492; RV32IA-TSO-NEXT: # %bb.4: 9493; RV32IA-TSO-NEXT: srl a0, a4, a0 9494; RV32IA-TSO-NEXT: ret 9495; 9496; RV64I-LABEL: atomicrmw_umin_i8_acq_rel: 9497; RV64I: # %bb.0: 9498; RV64I-NEXT: addi sp, sp, -48 9499; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9500; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9501; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9502; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9503; RV64I-NEXT: mv s0, a0 9504; RV64I-NEXT: lbu a3, 0(a0) 9505; RV64I-NEXT: mv s1, a1 9506; RV64I-NEXT: andi s2, a1, 255 9507; RV64I-NEXT: j .LBB63_2 9508; RV64I-NEXT: .LBB63_1: # %atomicrmw.start 9509; RV64I-NEXT: # in Loop: Header=BB63_2 Depth=1 9510; RV64I-NEXT: sb a3, 15(sp) 9511; RV64I-NEXT: addi a1, sp, 15 9512; RV64I-NEXT: li a3, 4 9513; RV64I-NEXT: li a4, 2 9514; RV64I-NEXT: mv a0, s0 9515; RV64I-NEXT: call __atomic_compare_exchange_1 9516; RV64I-NEXT: lbu a3, 15(sp) 9517; RV64I-NEXT: bnez a0, .LBB63_4 9518; RV64I-NEXT: .LBB63_2: # %atomicrmw.start 9519; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9520; RV64I-NEXT: andi a0, a3, 255 9521; RV64I-NEXT: mv a2, a3 9522; RV64I-NEXT: bgeu s2, a0, .LBB63_1 9523; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9524; RV64I-NEXT: # in Loop: Header=BB63_2 Depth=1 9525; RV64I-NEXT: mv a2, s1 9526; RV64I-NEXT: j .LBB63_1 9527; RV64I-NEXT: .LBB63_4: # %atomicrmw.end 9528; RV64I-NEXT: mv a0, a3 9529; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9530; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9531; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9532; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9533; RV64I-NEXT: addi sp, sp, 48 9534; RV64I-NEXT: ret 9535; 9536; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_acq_rel: 9537; RV64IA-WMO-NOZACAS: # %bb.0: 9538; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 9539; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 9540; RV64IA-WMO-NOZACAS-NEXT: li a3, 255 9541; RV64IA-WMO-NOZACAS-NEXT: andi a1, a1, 255 9542; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 9543; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 9544; RV64IA-WMO-NOZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 9545; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2) 9546; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3 9547; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4 9548; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB63_3 9549; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1 9550; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1 9551; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3 9552; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5 9553; RV64IA-WMO-NOZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1 9554; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 9555; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB63_1 9556; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 9557; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0 9558; RV64IA-WMO-NOZACAS-NEXT: ret 9559; 9560; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_acq_rel: 9561; RV64IA-TSO-NOZACAS: # %bb.0: 9562; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 9563; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 9564; RV64IA-TSO-NOZACAS-NEXT: li a3, 255 9565; RV64IA-TSO-NOZACAS-NEXT: andi a1, a1, 255 9566; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 9567; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 9568; RV64IA-TSO-NOZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 9569; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2) 9570; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3 9571; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4 9572; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB63_3 9573; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1 9574; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1 9575; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3 9576; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5 9577; RV64IA-TSO-NOZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1 9578; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 9579; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB63_1 9580; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 9581; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0 9582; RV64IA-TSO-NOZACAS-NEXT: ret 9583; 9584; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_acq_rel: 9585; RV64IA-WMO-ZACAS: # %bb.0: 9586; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 9587; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 9588; RV64IA-WMO-ZACAS-NEXT: li a3, 255 9589; RV64IA-WMO-ZACAS-NEXT: andi a1, a1, 255 9590; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 9591; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 9592; RV64IA-WMO-ZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 9593; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2) 9594; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3 9595; RV64IA-WMO-ZACAS-NEXT: mv a5, a4 9596; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB63_3 9597; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1 9598; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1 9599; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3 9600; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5 9601; RV64IA-WMO-ZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1 9602; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 9603; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB63_1 9604; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 9605; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0 9606; RV64IA-WMO-ZACAS-NEXT: ret 9607; 9608; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_acq_rel: 9609; RV64IA-TSO-ZACAS: # %bb.0: 9610; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 9611; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 9612; RV64IA-TSO-ZACAS-NEXT: li a3, 255 9613; RV64IA-TSO-ZACAS-NEXT: andi a1, a1, 255 9614; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 9615; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 9616; RV64IA-TSO-ZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1 9617; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2) 9618; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3 9619; RV64IA-TSO-ZACAS-NEXT: mv a5, a4 9620; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB63_3 9621; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1 9622; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1 9623; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3 9624; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5 9625; RV64IA-TSO-ZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1 9626; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 9627; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB63_1 9628; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 9629; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0 9630; RV64IA-TSO-ZACAS-NEXT: ret 9631; 9632; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_acq_rel: 9633; RV64IA-WMO-ZABHA: # %bb.0: 9634; RV64IA-WMO-ZABHA-NEXT: amominu.b.aqrl a0, a1, (a0) 9635; RV64IA-WMO-ZABHA-NEXT: ret 9636; 9637; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_acq_rel: 9638; RV64IA-TSO-ZABHA: # %bb.0: 9639; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0) 9640; RV64IA-TSO-ZABHA-NEXT: ret 9641 %1 = atomicrmw umin ptr %a, i8 %b acq_rel 9642 ret i8 %1 9643} 9644 9645define i8 @atomicrmw_umin_i8_seq_cst(ptr %a, i8 %b) nounwind { 9646; RV32I-LABEL: atomicrmw_umin_i8_seq_cst: 9647; RV32I: # %bb.0: 9648; RV32I-NEXT: addi sp, sp, -32 9649; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 9650; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 9651; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 9652; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 9653; RV32I-NEXT: mv s0, a0 9654; RV32I-NEXT: lbu a3, 0(a0) 9655; RV32I-NEXT: mv s1, a1 9656; RV32I-NEXT: andi s2, a1, 255 9657; RV32I-NEXT: j .LBB64_2 9658; RV32I-NEXT: .LBB64_1: # %atomicrmw.start 9659; RV32I-NEXT: # in Loop: Header=BB64_2 Depth=1 9660; RV32I-NEXT: sb a3, 15(sp) 9661; RV32I-NEXT: addi a1, sp, 15 9662; RV32I-NEXT: li a3, 5 9663; RV32I-NEXT: li a4, 5 9664; RV32I-NEXT: mv a0, s0 9665; RV32I-NEXT: call __atomic_compare_exchange_1 9666; RV32I-NEXT: lbu a3, 15(sp) 9667; RV32I-NEXT: bnez a0, .LBB64_4 9668; RV32I-NEXT: .LBB64_2: # %atomicrmw.start 9669; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 9670; RV32I-NEXT: andi a0, a3, 255 9671; RV32I-NEXT: mv a2, a3 9672; RV32I-NEXT: bgeu s2, a0, .LBB64_1 9673; RV32I-NEXT: # %bb.3: # %atomicrmw.start 9674; RV32I-NEXT: # in Loop: Header=BB64_2 Depth=1 9675; RV32I-NEXT: mv a2, s1 9676; RV32I-NEXT: j .LBB64_1 9677; RV32I-NEXT: .LBB64_4: # %atomicrmw.end 9678; RV32I-NEXT: mv a0, a3 9679; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 9680; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 9681; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 9682; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 9683; RV32I-NEXT: addi sp, sp, 32 9684; RV32I-NEXT: ret 9685; 9686; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst: 9687; RV32IA: # %bb.0: 9688; RV32IA-NEXT: andi a2, a0, -4 9689; RV32IA-NEXT: slli a0, a0, 3 9690; RV32IA-NEXT: li a3, 255 9691; RV32IA-NEXT: andi a1, a1, 255 9692; RV32IA-NEXT: sll a3, a3, a0 9693; RV32IA-NEXT: sll a1, a1, a0 9694; RV32IA-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 9695; RV32IA-NEXT: lr.w.aqrl a4, (a2) 9696; RV32IA-NEXT: and a6, a4, a3 9697; RV32IA-NEXT: mv a5, a4 9698; RV32IA-NEXT: bgeu a1, a6, .LBB64_3 9699; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB64_1 Depth=1 9700; RV32IA-NEXT: xor a5, a4, a1 9701; RV32IA-NEXT: and a5, a5, a3 9702; RV32IA-NEXT: xor a5, a4, a5 9703; RV32IA-NEXT: .LBB64_3: # in Loop: Header=BB64_1 Depth=1 9704; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 9705; RV32IA-NEXT: bnez a5, .LBB64_1 9706; RV32IA-NEXT: # %bb.4: 9707; RV32IA-NEXT: srl a0, a4, a0 9708; RV32IA-NEXT: ret 9709; 9710; RV64I-LABEL: atomicrmw_umin_i8_seq_cst: 9711; RV64I: # %bb.0: 9712; RV64I-NEXT: addi sp, sp, -48 9713; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9714; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9715; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9716; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9717; RV64I-NEXT: mv s0, a0 9718; RV64I-NEXT: lbu a3, 0(a0) 9719; RV64I-NEXT: mv s1, a1 9720; RV64I-NEXT: andi s2, a1, 255 9721; RV64I-NEXT: j .LBB64_2 9722; RV64I-NEXT: .LBB64_1: # %atomicrmw.start 9723; RV64I-NEXT: # in Loop: Header=BB64_2 Depth=1 9724; RV64I-NEXT: sb a3, 15(sp) 9725; RV64I-NEXT: addi a1, sp, 15 9726; RV64I-NEXT: li a3, 5 9727; RV64I-NEXT: li a4, 5 9728; RV64I-NEXT: mv a0, s0 9729; RV64I-NEXT: call __atomic_compare_exchange_1 9730; RV64I-NEXT: lbu a3, 15(sp) 9731; RV64I-NEXT: bnez a0, .LBB64_4 9732; RV64I-NEXT: .LBB64_2: # %atomicrmw.start 9733; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9734; RV64I-NEXT: andi a0, a3, 255 9735; RV64I-NEXT: mv a2, a3 9736; RV64I-NEXT: bgeu s2, a0, .LBB64_1 9737; RV64I-NEXT: # %bb.3: # %atomicrmw.start 9738; RV64I-NEXT: # in Loop: Header=BB64_2 Depth=1 9739; RV64I-NEXT: mv a2, s1 9740; RV64I-NEXT: j .LBB64_1 9741; RV64I-NEXT: .LBB64_4: # %atomicrmw.end 9742; RV64I-NEXT: mv a0, a3 9743; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9744; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9745; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9746; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 9747; RV64I-NEXT: addi sp, sp, 48 9748; RV64I-NEXT: ret 9749; 9750; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i8_seq_cst: 9751; RV64IA-NOZACAS: # %bb.0: 9752; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 9753; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 9754; RV64IA-NOZACAS-NEXT: li a3, 255 9755; RV64IA-NOZACAS-NEXT: andi a1, a1, 255 9756; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 9757; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 9758; RV64IA-NOZACAS-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 9759; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2) 9760; RV64IA-NOZACAS-NEXT: and a6, a4, a3 9761; RV64IA-NOZACAS-NEXT: mv a5, a4 9762; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB64_3 9763; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB64_1 Depth=1 9764; RV64IA-NOZACAS-NEXT: xor a5, a4, a1 9765; RV64IA-NOZACAS-NEXT: and a5, a5, a3 9766; RV64IA-NOZACAS-NEXT: xor a5, a4, a5 9767; RV64IA-NOZACAS-NEXT: .LBB64_3: # in Loop: Header=BB64_1 Depth=1 9768; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 9769; RV64IA-NOZACAS-NEXT: bnez a5, .LBB64_1 9770; RV64IA-NOZACAS-NEXT: # %bb.4: 9771; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0 9772; RV64IA-NOZACAS-NEXT: ret 9773; 9774; RV64IA-ZACAS-LABEL: atomicrmw_umin_i8_seq_cst: 9775; RV64IA-ZACAS: # %bb.0: 9776; RV64IA-ZACAS-NEXT: andi a2, a0, -4 9777; RV64IA-ZACAS-NEXT: slli a0, a0, 3 9778; RV64IA-ZACAS-NEXT: li a3, 255 9779; RV64IA-ZACAS-NEXT: andi a1, a1, 255 9780; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 9781; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 9782; RV64IA-ZACAS-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1 9783; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2) 9784; RV64IA-ZACAS-NEXT: and a6, a4, a3 9785; RV64IA-ZACAS-NEXT: mv a5, a4 9786; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB64_3 9787; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB64_1 Depth=1 9788; RV64IA-ZACAS-NEXT: xor a5, a4, a1 9789; RV64IA-ZACAS-NEXT: and a5, a5, a3 9790; RV64IA-ZACAS-NEXT: xor a5, a4, a5 9791; RV64IA-ZACAS-NEXT: .LBB64_3: # in Loop: Header=BB64_1 Depth=1 9792; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 9793; RV64IA-ZACAS-NEXT: bnez a5, .LBB64_1 9794; RV64IA-ZACAS-NEXT: # %bb.4: 9795; RV64IA-ZACAS-NEXT: srlw a0, a4, a0 9796; RV64IA-ZACAS-NEXT: ret 9797; 9798; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_seq_cst: 9799; RV64IA-WMO-ZABHA: # %bb.0: 9800; RV64IA-WMO-ZABHA-NEXT: amominu.b.aqrl a0, a1, (a0) 9801; RV64IA-WMO-ZABHA-NEXT: ret 9802; 9803; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_seq_cst: 9804; RV64IA-TSO-ZABHA: # %bb.0: 9805; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0) 9806; RV64IA-TSO-ZABHA-NEXT: ret 9807 %1 = atomicrmw umin ptr %a, i8 %b seq_cst 9808 ret i8 %1 9809} 9810 9811define i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind { 9812; RV32I-LABEL: atomicrmw_xchg_i16_monotonic: 9813; RV32I: # %bb.0: 9814; RV32I-NEXT: addi sp, sp, -16 9815; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9816; RV32I-NEXT: li a2, 0 9817; RV32I-NEXT: call __atomic_exchange_2 9818; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9819; RV32I-NEXT: addi sp, sp, 16 9820; RV32I-NEXT: ret 9821; 9822; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic: 9823; RV32IA: # %bb.0: 9824; RV32IA-NEXT: andi a2, a0, -4 9825; RV32IA-NEXT: slli a0, a0, 3 9826; RV32IA-NEXT: lui a3, 16 9827; RV32IA-NEXT: addi a3, a3, -1 9828; RV32IA-NEXT: sll a4, a3, a0 9829; RV32IA-NEXT: and a1, a1, a3 9830; RV32IA-NEXT: sll a1, a1, a0 9831; RV32IA-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 9832; RV32IA-NEXT: lr.w a3, (a2) 9833; RV32IA-NEXT: mv a5, a1 9834; RV32IA-NEXT: xor a5, a3, a5 9835; RV32IA-NEXT: and a5, a5, a4 9836; RV32IA-NEXT: xor a5, a3, a5 9837; RV32IA-NEXT: sc.w a5, a5, (a2) 9838; RV32IA-NEXT: bnez a5, .LBB65_1 9839; RV32IA-NEXT: # %bb.2: 9840; RV32IA-NEXT: srl a0, a3, a0 9841; RV32IA-NEXT: ret 9842; 9843; RV64I-LABEL: atomicrmw_xchg_i16_monotonic: 9844; RV64I: # %bb.0: 9845; RV64I-NEXT: addi sp, sp, -16 9846; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9847; RV64I-NEXT: li a2, 0 9848; RV64I-NEXT: call __atomic_exchange_2 9849; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9850; RV64I-NEXT: addi sp, sp, 16 9851; RV64I-NEXT: ret 9852; 9853; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i16_monotonic: 9854; RV64IA-NOZACAS: # %bb.0: 9855; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 9856; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 9857; RV64IA-NOZACAS-NEXT: lui a3, 16 9858; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 9859; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 9860; RV64IA-NOZACAS-NEXT: and a1, a1, a3 9861; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 9862; RV64IA-NOZACAS-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 9863; RV64IA-NOZACAS-NEXT: lr.w a3, (a2) 9864; RV64IA-NOZACAS-NEXT: mv a5, a1 9865; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 9866; RV64IA-NOZACAS-NEXT: and a5, a5, a4 9867; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 9868; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 9869; RV64IA-NOZACAS-NEXT: bnez a5, .LBB65_1 9870; RV64IA-NOZACAS-NEXT: # %bb.2: 9871; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 9872; RV64IA-NOZACAS-NEXT: ret 9873; 9874; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i16_monotonic: 9875; RV64IA-ZACAS: # %bb.0: 9876; RV64IA-ZACAS-NEXT: andi a2, a0, -4 9877; RV64IA-ZACAS-NEXT: slli a0, a0, 3 9878; RV64IA-ZACAS-NEXT: lui a3, 16 9879; RV64IA-ZACAS-NEXT: addi a3, a3, -1 9880; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 9881; RV64IA-ZACAS-NEXT: and a1, a1, a3 9882; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 9883; RV64IA-ZACAS-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1 9884; RV64IA-ZACAS-NEXT: lr.w a3, (a2) 9885; RV64IA-ZACAS-NEXT: mv a5, a1 9886; RV64IA-ZACAS-NEXT: xor a5, a3, a5 9887; RV64IA-ZACAS-NEXT: and a5, a5, a4 9888; RV64IA-ZACAS-NEXT: xor a5, a3, a5 9889; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 9890; RV64IA-ZACAS-NEXT: bnez a5, .LBB65_1 9891; RV64IA-ZACAS-NEXT: # %bb.2: 9892; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 9893; RV64IA-ZACAS-NEXT: ret 9894; 9895; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_monotonic: 9896; RV64IA-WMO-ZABHA: # %bb.0: 9897; RV64IA-WMO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 9898; RV64IA-WMO-ZABHA-NEXT: ret 9899; 9900; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_monotonic: 9901; RV64IA-TSO-ZABHA: # %bb.0: 9902; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 9903; RV64IA-TSO-ZABHA-NEXT: ret 9904 %1 = atomicrmw xchg ptr %a, i16 %b monotonic 9905 ret i16 %1 9906} 9907 9908define i16 @atomicrmw_xchg_i16_acquire(ptr %a, i16 %b) nounwind { 9909; RV32I-LABEL: atomicrmw_xchg_i16_acquire: 9910; RV32I: # %bb.0: 9911; RV32I-NEXT: addi sp, sp, -16 9912; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 9913; RV32I-NEXT: li a2, 2 9914; RV32I-NEXT: call __atomic_exchange_2 9915; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 9916; RV32I-NEXT: addi sp, sp, 16 9917; RV32I-NEXT: ret 9918; 9919; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_acquire: 9920; RV32IA-WMO: # %bb.0: 9921; RV32IA-WMO-NEXT: andi a2, a0, -4 9922; RV32IA-WMO-NEXT: slli a0, a0, 3 9923; RV32IA-WMO-NEXT: lui a3, 16 9924; RV32IA-WMO-NEXT: addi a3, a3, -1 9925; RV32IA-WMO-NEXT: sll a4, a3, a0 9926; RV32IA-WMO-NEXT: and a1, a1, a3 9927; RV32IA-WMO-NEXT: sll a1, a1, a0 9928; RV32IA-WMO-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 9929; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 9930; RV32IA-WMO-NEXT: mv a5, a1 9931; RV32IA-WMO-NEXT: xor a5, a3, a5 9932; RV32IA-WMO-NEXT: and a5, a5, a4 9933; RV32IA-WMO-NEXT: xor a5, a3, a5 9934; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 9935; RV32IA-WMO-NEXT: bnez a5, .LBB66_1 9936; RV32IA-WMO-NEXT: # %bb.2: 9937; RV32IA-WMO-NEXT: srl a0, a3, a0 9938; RV32IA-WMO-NEXT: ret 9939; 9940; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_acquire: 9941; RV32IA-TSO: # %bb.0: 9942; RV32IA-TSO-NEXT: andi a2, a0, -4 9943; RV32IA-TSO-NEXT: slli a0, a0, 3 9944; RV32IA-TSO-NEXT: lui a3, 16 9945; RV32IA-TSO-NEXT: addi a3, a3, -1 9946; RV32IA-TSO-NEXT: sll a4, a3, a0 9947; RV32IA-TSO-NEXT: and a1, a1, a3 9948; RV32IA-TSO-NEXT: sll a1, a1, a0 9949; RV32IA-TSO-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 9950; RV32IA-TSO-NEXT: lr.w a3, (a2) 9951; RV32IA-TSO-NEXT: mv a5, a1 9952; RV32IA-TSO-NEXT: xor a5, a3, a5 9953; RV32IA-TSO-NEXT: and a5, a5, a4 9954; RV32IA-TSO-NEXT: xor a5, a3, a5 9955; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 9956; RV32IA-TSO-NEXT: bnez a5, .LBB66_1 9957; RV32IA-TSO-NEXT: # %bb.2: 9958; RV32IA-TSO-NEXT: srl a0, a3, a0 9959; RV32IA-TSO-NEXT: ret 9960; 9961; RV64I-LABEL: atomicrmw_xchg_i16_acquire: 9962; RV64I: # %bb.0: 9963; RV64I-NEXT: addi sp, sp, -16 9964; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 9965; RV64I-NEXT: li a2, 2 9966; RV64I-NEXT: call __atomic_exchange_2 9967; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 9968; RV64I-NEXT: addi sp, sp, 16 9969; RV64I-NEXT: ret 9970; 9971; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_acquire: 9972; RV64IA-WMO-NOZACAS: # %bb.0: 9973; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 9974; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 9975; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 9976; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 9977; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 9978; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 9979; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 9980; RV64IA-WMO-NOZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 9981; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 9982; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1 9983; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 9984; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 9985; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 9986; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 9987; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB66_1 9988; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 9989; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 9990; RV64IA-WMO-NOZACAS-NEXT: ret 9991; 9992; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_acquire: 9993; RV64IA-TSO-NOZACAS: # %bb.0: 9994; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 9995; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 9996; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 9997; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 9998; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 9999; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 10000; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 10001; RV64IA-TSO-NOZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 10002; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 10003; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1 10004; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 10005; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 10006; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 10007; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 10008; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB66_1 10009; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 10010; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 10011; RV64IA-TSO-NOZACAS-NEXT: ret 10012; 10013; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_acquire: 10014; RV64IA-WMO-ZACAS: # %bb.0: 10015; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 10016; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10017; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 10018; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 10019; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 10020; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 10021; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 10022; RV64IA-WMO-ZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 10023; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 10024; RV64IA-WMO-ZACAS-NEXT: mv a5, a1 10025; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 10026; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 10027; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 10028; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 10029; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB66_1 10030; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 10031; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 10032; RV64IA-WMO-ZACAS-NEXT: ret 10033; 10034; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_acquire: 10035; RV64IA-TSO-ZACAS: # %bb.0: 10036; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 10037; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10038; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 10039; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 10040; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 10041; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 10042; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 10043; RV64IA-TSO-ZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1 10044; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 10045; RV64IA-TSO-ZACAS-NEXT: mv a5, a1 10046; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 10047; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 10048; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 10049; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 10050; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB66_1 10051; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 10052; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 10053; RV64IA-TSO-ZACAS-NEXT: ret 10054; 10055; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_acquire: 10056; RV64IA-WMO-ZABHA: # %bb.0: 10057; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aq a0, a1, (a0) 10058; RV64IA-WMO-ZABHA-NEXT: ret 10059; 10060; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_acquire: 10061; RV64IA-TSO-ZABHA: # %bb.0: 10062; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 10063; RV64IA-TSO-ZABHA-NEXT: ret 10064 %1 = atomicrmw xchg ptr %a, i16 %b acquire 10065 ret i16 %1 10066} 10067 10068define i16 @atomicrmw_xchg_i16_release(ptr %a, i16 %b) nounwind { 10069; RV32I-LABEL: atomicrmw_xchg_i16_release: 10070; RV32I: # %bb.0: 10071; RV32I-NEXT: addi sp, sp, -16 10072; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10073; RV32I-NEXT: li a2, 3 10074; RV32I-NEXT: call __atomic_exchange_2 10075; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10076; RV32I-NEXT: addi sp, sp, 16 10077; RV32I-NEXT: ret 10078; 10079; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_release: 10080; RV32IA-WMO: # %bb.0: 10081; RV32IA-WMO-NEXT: andi a2, a0, -4 10082; RV32IA-WMO-NEXT: slli a0, a0, 3 10083; RV32IA-WMO-NEXT: lui a3, 16 10084; RV32IA-WMO-NEXT: addi a3, a3, -1 10085; RV32IA-WMO-NEXT: sll a4, a3, a0 10086; RV32IA-WMO-NEXT: and a1, a1, a3 10087; RV32IA-WMO-NEXT: sll a1, a1, a0 10088; RV32IA-WMO-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 10089; RV32IA-WMO-NEXT: lr.w a3, (a2) 10090; RV32IA-WMO-NEXT: mv a5, a1 10091; RV32IA-WMO-NEXT: xor a5, a3, a5 10092; RV32IA-WMO-NEXT: and a5, a5, a4 10093; RV32IA-WMO-NEXT: xor a5, a3, a5 10094; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 10095; RV32IA-WMO-NEXT: bnez a5, .LBB67_1 10096; RV32IA-WMO-NEXT: # %bb.2: 10097; RV32IA-WMO-NEXT: srl a0, a3, a0 10098; RV32IA-WMO-NEXT: ret 10099; 10100; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_release: 10101; RV32IA-TSO: # %bb.0: 10102; RV32IA-TSO-NEXT: andi a2, a0, -4 10103; RV32IA-TSO-NEXT: slli a0, a0, 3 10104; RV32IA-TSO-NEXT: lui a3, 16 10105; RV32IA-TSO-NEXT: addi a3, a3, -1 10106; RV32IA-TSO-NEXT: sll a4, a3, a0 10107; RV32IA-TSO-NEXT: and a1, a1, a3 10108; RV32IA-TSO-NEXT: sll a1, a1, a0 10109; RV32IA-TSO-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 10110; RV32IA-TSO-NEXT: lr.w a3, (a2) 10111; RV32IA-TSO-NEXT: mv a5, a1 10112; RV32IA-TSO-NEXT: xor a5, a3, a5 10113; RV32IA-TSO-NEXT: and a5, a5, a4 10114; RV32IA-TSO-NEXT: xor a5, a3, a5 10115; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 10116; RV32IA-TSO-NEXT: bnez a5, .LBB67_1 10117; RV32IA-TSO-NEXT: # %bb.2: 10118; RV32IA-TSO-NEXT: srl a0, a3, a0 10119; RV32IA-TSO-NEXT: ret 10120; 10121; RV64I-LABEL: atomicrmw_xchg_i16_release: 10122; RV64I: # %bb.0: 10123; RV64I-NEXT: addi sp, sp, -16 10124; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10125; RV64I-NEXT: li a2, 3 10126; RV64I-NEXT: call __atomic_exchange_2 10127; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10128; RV64I-NEXT: addi sp, sp, 16 10129; RV64I-NEXT: ret 10130; 10131; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_release: 10132; RV64IA-WMO-NOZACAS: # %bb.0: 10133; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 10134; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 10135; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 10136; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 10137; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 10138; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 10139; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 10140; RV64IA-WMO-NOZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 10141; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2) 10142; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1 10143; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 10144; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 10145; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 10146; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 10147; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB67_1 10148; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 10149; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 10150; RV64IA-WMO-NOZACAS-NEXT: ret 10151; 10152; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_release: 10153; RV64IA-TSO-NOZACAS: # %bb.0: 10154; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 10155; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 10156; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 10157; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 10158; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 10159; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 10160; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 10161; RV64IA-TSO-NOZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 10162; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 10163; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1 10164; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 10165; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 10166; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 10167; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 10168; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB67_1 10169; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 10170; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 10171; RV64IA-TSO-NOZACAS-NEXT: ret 10172; 10173; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_release: 10174; RV64IA-WMO-ZACAS: # %bb.0: 10175; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 10176; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10177; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 10178; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 10179; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 10180; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 10181; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 10182; RV64IA-WMO-ZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 10183; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2) 10184; RV64IA-WMO-ZACAS-NEXT: mv a5, a1 10185; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 10186; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 10187; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 10188; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 10189; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB67_1 10190; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 10191; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 10192; RV64IA-WMO-ZACAS-NEXT: ret 10193; 10194; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_release: 10195; RV64IA-TSO-ZACAS: # %bb.0: 10196; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 10197; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10198; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 10199; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 10200; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 10201; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 10202; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 10203; RV64IA-TSO-ZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1 10204; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 10205; RV64IA-TSO-ZACAS-NEXT: mv a5, a1 10206; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 10207; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 10208; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 10209; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 10210; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB67_1 10211; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 10212; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 10213; RV64IA-TSO-ZACAS-NEXT: ret 10214; 10215; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_release: 10216; RV64IA-WMO-ZABHA: # %bb.0: 10217; RV64IA-WMO-ZABHA-NEXT: amoswap.h.rl a0, a1, (a0) 10218; RV64IA-WMO-ZABHA-NEXT: ret 10219; 10220; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_release: 10221; RV64IA-TSO-ZABHA: # %bb.0: 10222; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 10223; RV64IA-TSO-ZABHA-NEXT: ret 10224 %1 = atomicrmw xchg ptr %a, i16 %b release 10225 ret i16 %1 10226} 10227 10228define i16 @atomicrmw_xchg_i16_acq_rel(ptr %a, i16 %b) nounwind { 10229; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel: 10230; RV32I: # %bb.0: 10231; RV32I-NEXT: addi sp, sp, -16 10232; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10233; RV32I-NEXT: li a2, 4 10234; RV32I-NEXT: call __atomic_exchange_2 10235; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10236; RV32I-NEXT: addi sp, sp, 16 10237; RV32I-NEXT: ret 10238; 10239; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_acq_rel: 10240; RV32IA-WMO: # %bb.0: 10241; RV32IA-WMO-NEXT: andi a2, a0, -4 10242; RV32IA-WMO-NEXT: slli a0, a0, 3 10243; RV32IA-WMO-NEXT: lui a3, 16 10244; RV32IA-WMO-NEXT: addi a3, a3, -1 10245; RV32IA-WMO-NEXT: sll a4, a3, a0 10246; RV32IA-WMO-NEXT: and a1, a1, a3 10247; RV32IA-WMO-NEXT: sll a1, a1, a0 10248; RV32IA-WMO-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 10249; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 10250; RV32IA-WMO-NEXT: mv a5, a1 10251; RV32IA-WMO-NEXT: xor a5, a3, a5 10252; RV32IA-WMO-NEXT: and a5, a5, a4 10253; RV32IA-WMO-NEXT: xor a5, a3, a5 10254; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 10255; RV32IA-WMO-NEXT: bnez a5, .LBB68_1 10256; RV32IA-WMO-NEXT: # %bb.2: 10257; RV32IA-WMO-NEXT: srl a0, a3, a0 10258; RV32IA-WMO-NEXT: ret 10259; 10260; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_acq_rel: 10261; RV32IA-TSO: # %bb.0: 10262; RV32IA-TSO-NEXT: andi a2, a0, -4 10263; RV32IA-TSO-NEXT: slli a0, a0, 3 10264; RV32IA-TSO-NEXT: lui a3, 16 10265; RV32IA-TSO-NEXT: addi a3, a3, -1 10266; RV32IA-TSO-NEXT: sll a4, a3, a0 10267; RV32IA-TSO-NEXT: and a1, a1, a3 10268; RV32IA-TSO-NEXT: sll a1, a1, a0 10269; RV32IA-TSO-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 10270; RV32IA-TSO-NEXT: lr.w a3, (a2) 10271; RV32IA-TSO-NEXT: mv a5, a1 10272; RV32IA-TSO-NEXT: xor a5, a3, a5 10273; RV32IA-TSO-NEXT: and a5, a5, a4 10274; RV32IA-TSO-NEXT: xor a5, a3, a5 10275; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 10276; RV32IA-TSO-NEXT: bnez a5, .LBB68_1 10277; RV32IA-TSO-NEXT: # %bb.2: 10278; RV32IA-TSO-NEXT: srl a0, a3, a0 10279; RV32IA-TSO-NEXT: ret 10280; 10281; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel: 10282; RV64I: # %bb.0: 10283; RV64I-NEXT: addi sp, sp, -16 10284; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10285; RV64I-NEXT: li a2, 4 10286; RV64I-NEXT: call __atomic_exchange_2 10287; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10288; RV64I-NEXT: addi sp, sp, 16 10289; RV64I-NEXT: ret 10290; 10291; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_acq_rel: 10292; RV64IA-WMO-NOZACAS: # %bb.0: 10293; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 10294; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 10295; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 10296; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 10297; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 10298; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 10299; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 10300; RV64IA-WMO-NOZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 10301; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 10302; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1 10303; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 10304; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 10305; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 10306; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 10307; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB68_1 10308; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 10309; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 10310; RV64IA-WMO-NOZACAS-NEXT: ret 10311; 10312; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_acq_rel: 10313; RV64IA-TSO-NOZACAS: # %bb.0: 10314; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 10315; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 10316; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 10317; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 10318; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 10319; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 10320; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 10321; RV64IA-TSO-NOZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 10322; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 10323; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1 10324; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 10325; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 10326; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 10327; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 10328; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB68_1 10329; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 10330; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 10331; RV64IA-TSO-NOZACAS-NEXT: ret 10332; 10333; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_acq_rel: 10334; RV64IA-WMO-ZACAS: # %bb.0: 10335; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 10336; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10337; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 10338; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 10339; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 10340; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 10341; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 10342; RV64IA-WMO-ZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 10343; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 10344; RV64IA-WMO-ZACAS-NEXT: mv a5, a1 10345; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 10346; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 10347; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 10348; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 10349; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB68_1 10350; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 10351; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 10352; RV64IA-WMO-ZACAS-NEXT: ret 10353; 10354; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_acq_rel: 10355; RV64IA-TSO-ZACAS: # %bb.0: 10356; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 10357; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10358; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 10359; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 10360; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 10361; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 10362; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 10363; RV64IA-TSO-ZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1 10364; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 10365; RV64IA-TSO-ZACAS-NEXT: mv a5, a1 10366; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 10367; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 10368; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 10369; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 10370; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB68_1 10371; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 10372; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 10373; RV64IA-TSO-ZACAS-NEXT: ret 10374; 10375; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_acq_rel: 10376; RV64IA-WMO-ZABHA: # %bb.0: 10377; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0) 10378; RV64IA-WMO-ZABHA-NEXT: ret 10379; 10380; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_acq_rel: 10381; RV64IA-TSO-ZABHA: # %bb.0: 10382; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 10383; RV64IA-TSO-ZABHA-NEXT: ret 10384 %1 = atomicrmw xchg ptr %a, i16 %b acq_rel 10385 ret i16 %1 10386} 10387 10388define i16 @atomicrmw_xchg_i16_seq_cst(ptr %a, i16 %b) nounwind { 10389; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst: 10390; RV32I: # %bb.0: 10391; RV32I-NEXT: addi sp, sp, -16 10392; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10393; RV32I-NEXT: li a2, 5 10394; RV32I-NEXT: call __atomic_exchange_2 10395; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10396; RV32I-NEXT: addi sp, sp, 16 10397; RV32I-NEXT: ret 10398; 10399; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst: 10400; RV32IA: # %bb.0: 10401; RV32IA-NEXT: andi a2, a0, -4 10402; RV32IA-NEXT: slli a0, a0, 3 10403; RV32IA-NEXT: lui a3, 16 10404; RV32IA-NEXT: addi a3, a3, -1 10405; RV32IA-NEXT: sll a4, a3, a0 10406; RV32IA-NEXT: and a1, a1, a3 10407; RV32IA-NEXT: sll a1, a1, a0 10408; RV32IA-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 10409; RV32IA-NEXT: lr.w.aqrl a3, (a2) 10410; RV32IA-NEXT: mv a5, a1 10411; RV32IA-NEXT: xor a5, a3, a5 10412; RV32IA-NEXT: and a5, a5, a4 10413; RV32IA-NEXT: xor a5, a3, a5 10414; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 10415; RV32IA-NEXT: bnez a5, .LBB69_1 10416; RV32IA-NEXT: # %bb.2: 10417; RV32IA-NEXT: srl a0, a3, a0 10418; RV32IA-NEXT: ret 10419; 10420; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst: 10421; RV64I: # %bb.0: 10422; RV64I-NEXT: addi sp, sp, -16 10423; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10424; RV64I-NEXT: li a2, 5 10425; RV64I-NEXT: call __atomic_exchange_2 10426; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10427; RV64I-NEXT: addi sp, sp, 16 10428; RV64I-NEXT: ret 10429; 10430; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i16_seq_cst: 10431; RV64IA-NOZACAS: # %bb.0: 10432; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 10433; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 10434; RV64IA-NOZACAS-NEXT: lui a3, 16 10435; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 10436; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 10437; RV64IA-NOZACAS-NEXT: and a1, a1, a3 10438; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 10439; RV64IA-NOZACAS-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 10440; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 10441; RV64IA-NOZACAS-NEXT: mv a5, a1 10442; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 10443; RV64IA-NOZACAS-NEXT: and a5, a5, a4 10444; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 10445; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 10446; RV64IA-NOZACAS-NEXT: bnez a5, .LBB69_1 10447; RV64IA-NOZACAS-NEXT: # %bb.2: 10448; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 10449; RV64IA-NOZACAS-NEXT: ret 10450; 10451; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i16_seq_cst: 10452; RV64IA-ZACAS: # %bb.0: 10453; RV64IA-ZACAS-NEXT: andi a2, a0, -4 10454; RV64IA-ZACAS-NEXT: slli a0, a0, 3 10455; RV64IA-ZACAS-NEXT: lui a3, 16 10456; RV64IA-ZACAS-NEXT: addi a3, a3, -1 10457; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 10458; RV64IA-ZACAS-NEXT: and a1, a1, a3 10459; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 10460; RV64IA-ZACAS-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1 10461; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2) 10462; RV64IA-ZACAS-NEXT: mv a5, a1 10463; RV64IA-ZACAS-NEXT: xor a5, a3, a5 10464; RV64IA-ZACAS-NEXT: and a5, a5, a4 10465; RV64IA-ZACAS-NEXT: xor a5, a3, a5 10466; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 10467; RV64IA-ZACAS-NEXT: bnez a5, .LBB69_1 10468; RV64IA-ZACAS-NEXT: # %bb.2: 10469; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 10470; RV64IA-ZACAS-NEXT: ret 10471; 10472; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_seq_cst: 10473; RV64IA-WMO-ZABHA: # %bb.0: 10474; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0) 10475; RV64IA-WMO-ZABHA-NEXT: ret 10476; 10477; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_seq_cst: 10478; RV64IA-TSO-ZABHA: # %bb.0: 10479; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 10480; RV64IA-TSO-ZABHA-NEXT: ret 10481 %1 = atomicrmw xchg ptr %a, i16 %b seq_cst 10482 ret i16 %1 10483} 10484 10485; Ensure the following 'atomicrmw xchg a, {0,-1}` cases are lowered to an 10486; amoand or amoor with appropriate mask. 10487 10488define i16 @atomicrmw_xchg_0_i16_monotonic(ptr %a) nounwind { 10489; RV32I-LABEL: atomicrmw_xchg_0_i16_monotonic: 10490; RV32I: # %bb.0: 10491; RV32I-NEXT: addi sp, sp, -16 10492; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10493; RV32I-NEXT: li a1, 0 10494; RV32I-NEXT: li a2, 0 10495; RV32I-NEXT: call __atomic_exchange_2 10496; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10497; RV32I-NEXT: addi sp, sp, 16 10498; RV32I-NEXT: ret 10499; 10500; RV32IA-LABEL: atomicrmw_xchg_0_i16_monotonic: 10501; RV32IA: # %bb.0: 10502; RV32IA-NEXT: andi a1, a0, -4 10503; RV32IA-NEXT: slli a0, a0, 3 10504; RV32IA-NEXT: lui a2, 16 10505; RV32IA-NEXT: addi a2, a2, -1 10506; RV32IA-NEXT: sll a2, a2, a0 10507; RV32IA-NEXT: not a2, a2 10508; RV32IA-NEXT: amoand.w a1, a2, (a1) 10509; RV32IA-NEXT: srl a0, a1, a0 10510; RV32IA-NEXT: ret 10511; 10512; RV64I-LABEL: atomicrmw_xchg_0_i16_monotonic: 10513; RV64I: # %bb.0: 10514; RV64I-NEXT: addi sp, sp, -16 10515; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10516; RV64I-NEXT: li a1, 0 10517; RV64I-NEXT: li a2, 0 10518; RV64I-NEXT: call __atomic_exchange_2 10519; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10520; RV64I-NEXT: addi sp, sp, 16 10521; RV64I-NEXT: ret 10522; 10523; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_0_i16_monotonic: 10524; RV64IA-NOZACAS: # %bb.0: 10525; RV64IA-NOZACAS-NEXT: andi a1, a0, -4 10526; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 10527; RV64IA-NOZACAS-NEXT: lui a2, 16 10528; RV64IA-NOZACAS-NEXT: addi a2, a2, -1 10529; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0 10530; RV64IA-NOZACAS-NEXT: not a2, a2 10531; RV64IA-NOZACAS-NEXT: amoand.w a1, a2, (a1) 10532; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 10533; RV64IA-NOZACAS-NEXT: ret 10534; 10535; RV64IA-ZACAS-LABEL: atomicrmw_xchg_0_i16_monotonic: 10536; RV64IA-ZACAS: # %bb.0: 10537; RV64IA-ZACAS-NEXT: andi a1, a0, -4 10538; RV64IA-ZACAS-NEXT: slli a0, a0, 3 10539; RV64IA-ZACAS-NEXT: lui a2, 16 10540; RV64IA-ZACAS-NEXT: addi a2, a2, -1 10541; RV64IA-ZACAS-NEXT: sllw a2, a2, a0 10542; RV64IA-ZACAS-NEXT: not a2, a2 10543; RV64IA-ZACAS-NEXT: amoand.w a1, a2, (a1) 10544; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 10545; RV64IA-ZACAS-NEXT: ret 10546; 10547; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_monotonic: 10548; RV64IA-WMO-ZABHA: # %bb.0: 10549; RV64IA-WMO-ZABHA-NEXT: amoswap.h a0, zero, (a0) 10550; RV64IA-WMO-ZABHA-NEXT: ret 10551; 10552; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_monotonic: 10553; RV64IA-TSO-ZABHA: # %bb.0: 10554; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0) 10555; RV64IA-TSO-ZABHA-NEXT: ret 10556 %1 = atomicrmw xchg ptr %a, i16 0 monotonic 10557 ret i16 %1 10558} 10559 10560define i16 @atomicrmw_xchg_0_i16_acquire(ptr %a) nounwind { 10561; RV32I-LABEL: atomicrmw_xchg_0_i16_acquire: 10562; RV32I: # %bb.0: 10563; RV32I-NEXT: addi sp, sp, -16 10564; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10565; RV32I-NEXT: li a2, 2 10566; RV32I-NEXT: li a1, 0 10567; RV32I-NEXT: call __atomic_exchange_2 10568; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10569; RV32I-NEXT: addi sp, sp, 16 10570; RV32I-NEXT: ret 10571; 10572; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_acquire: 10573; RV32IA-WMO: # %bb.0: 10574; RV32IA-WMO-NEXT: andi a1, a0, -4 10575; RV32IA-WMO-NEXT: slli a0, a0, 3 10576; RV32IA-WMO-NEXT: lui a2, 16 10577; RV32IA-WMO-NEXT: addi a2, a2, -1 10578; RV32IA-WMO-NEXT: sll a2, a2, a0 10579; RV32IA-WMO-NEXT: not a2, a2 10580; RV32IA-WMO-NEXT: amoand.w.aq a1, a2, (a1) 10581; RV32IA-WMO-NEXT: srl a0, a1, a0 10582; RV32IA-WMO-NEXT: ret 10583; 10584; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_acquire: 10585; RV32IA-TSO: # %bb.0: 10586; RV32IA-TSO-NEXT: andi a1, a0, -4 10587; RV32IA-TSO-NEXT: slli a0, a0, 3 10588; RV32IA-TSO-NEXT: lui a2, 16 10589; RV32IA-TSO-NEXT: addi a2, a2, -1 10590; RV32IA-TSO-NEXT: sll a2, a2, a0 10591; RV32IA-TSO-NEXT: not a2, a2 10592; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 10593; RV32IA-TSO-NEXT: srl a0, a1, a0 10594; RV32IA-TSO-NEXT: ret 10595; 10596; RV64I-LABEL: atomicrmw_xchg_0_i16_acquire: 10597; RV64I: # %bb.0: 10598; RV64I-NEXT: addi sp, sp, -16 10599; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10600; RV64I-NEXT: li a2, 2 10601; RV64I-NEXT: li a1, 0 10602; RV64I-NEXT: call __atomic_exchange_2 10603; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10604; RV64I-NEXT: addi sp, sp, 16 10605; RV64I-NEXT: ret 10606; 10607; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acquire: 10608; RV64IA-WMO-NOZACAS: # %bb.0: 10609; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 10610; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 10611; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 10612; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 10613; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 10614; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 10615; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a2, (a1) 10616; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 10617; RV64IA-WMO-NOZACAS-NEXT: ret 10618; 10619; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acquire: 10620; RV64IA-TSO-NOZACAS: # %bb.0: 10621; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 10622; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 10623; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 10624; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 10625; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 10626; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 10627; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 10628; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 10629; RV64IA-TSO-NOZACAS-NEXT: ret 10630; 10631; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acquire: 10632; RV64IA-WMO-ZACAS: # %bb.0: 10633; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 10634; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10635; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 10636; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 10637; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 10638; RV64IA-WMO-ZACAS-NEXT: not a2, a2 10639; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a2, (a1) 10640; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 10641; RV64IA-WMO-ZACAS-NEXT: ret 10642; 10643; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acquire: 10644; RV64IA-TSO-ZACAS: # %bb.0: 10645; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 10646; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10647; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 10648; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 10649; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 10650; RV64IA-TSO-ZACAS-NEXT: not a2, a2 10651; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 10652; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 10653; RV64IA-TSO-ZACAS-NEXT: ret 10654; 10655; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acquire: 10656; RV64IA-WMO-ZABHA: # %bb.0: 10657; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aq a0, zero, (a0) 10658; RV64IA-WMO-ZABHA-NEXT: ret 10659; 10660; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acquire: 10661; RV64IA-TSO-ZABHA: # %bb.0: 10662; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0) 10663; RV64IA-TSO-ZABHA-NEXT: ret 10664 %1 = atomicrmw xchg ptr %a, i16 0 acquire 10665 ret i16 %1 10666} 10667 10668define i16 @atomicrmw_xchg_0_i16_release(ptr %a) nounwind { 10669; RV32I-LABEL: atomicrmw_xchg_0_i16_release: 10670; RV32I: # %bb.0: 10671; RV32I-NEXT: addi sp, sp, -16 10672; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10673; RV32I-NEXT: li a2, 3 10674; RV32I-NEXT: li a1, 0 10675; RV32I-NEXT: call __atomic_exchange_2 10676; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10677; RV32I-NEXT: addi sp, sp, 16 10678; RV32I-NEXT: ret 10679; 10680; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_release: 10681; RV32IA-WMO: # %bb.0: 10682; RV32IA-WMO-NEXT: andi a1, a0, -4 10683; RV32IA-WMO-NEXT: slli a0, a0, 3 10684; RV32IA-WMO-NEXT: lui a2, 16 10685; RV32IA-WMO-NEXT: addi a2, a2, -1 10686; RV32IA-WMO-NEXT: sll a2, a2, a0 10687; RV32IA-WMO-NEXT: not a2, a2 10688; RV32IA-WMO-NEXT: amoand.w.rl a1, a2, (a1) 10689; RV32IA-WMO-NEXT: srl a0, a1, a0 10690; RV32IA-WMO-NEXT: ret 10691; 10692; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_release: 10693; RV32IA-TSO: # %bb.0: 10694; RV32IA-TSO-NEXT: andi a1, a0, -4 10695; RV32IA-TSO-NEXT: slli a0, a0, 3 10696; RV32IA-TSO-NEXT: lui a2, 16 10697; RV32IA-TSO-NEXT: addi a2, a2, -1 10698; RV32IA-TSO-NEXT: sll a2, a2, a0 10699; RV32IA-TSO-NEXT: not a2, a2 10700; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 10701; RV32IA-TSO-NEXT: srl a0, a1, a0 10702; RV32IA-TSO-NEXT: ret 10703; 10704; RV64I-LABEL: atomicrmw_xchg_0_i16_release: 10705; RV64I: # %bb.0: 10706; RV64I-NEXT: addi sp, sp, -16 10707; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10708; RV64I-NEXT: li a2, 3 10709; RV64I-NEXT: li a1, 0 10710; RV64I-NEXT: call __atomic_exchange_2 10711; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10712; RV64I-NEXT: addi sp, sp, 16 10713; RV64I-NEXT: ret 10714; 10715; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_release: 10716; RV64IA-WMO-NOZACAS: # %bb.0: 10717; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 10718; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 10719; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 10720; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 10721; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 10722; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 10723; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a2, (a1) 10724; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 10725; RV64IA-WMO-NOZACAS-NEXT: ret 10726; 10727; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_release: 10728; RV64IA-TSO-NOZACAS: # %bb.0: 10729; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 10730; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 10731; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 10732; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 10733; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 10734; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 10735; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 10736; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 10737; RV64IA-TSO-NOZACAS-NEXT: ret 10738; 10739; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_release: 10740; RV64IA-WMO-ZACAS: # %bb.0: 10741; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 10742; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10743; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 10744; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 10745; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 10746; RV64IA-WMO-ZACAS-NEXT: not a2, a2 10747; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a2, (a1) 10748; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 10749; RV64IA-WMO-ZACAS-NEXT: ret 10750; 10751; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_release: 10752; RV64IA-TSO-ZACAS: # %bb.0: 10753; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 10754; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10755; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 10756; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 10757; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 10758; RV64IA-TSO-ZACAS-NEXT: not a2, a2 10759; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 10760; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 10761; RV64IA-TSO-ZACAS-NEXT: ret 10762; 10763; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_release: 10764; RV64IA-WMO-ZABHA: # %bb.0: 10765; RV64IA-WMO-ZABHA-NEXT: amoswap.h.rl a0, zero, (a0) 10766; RV64IA-WMO-ZABHA-NEXT: ret 10767; 10768; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_release: 10769; RV64IA-TSO-ZABHA: # %bb.0: 10770; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0) 10771; RV64IA-TSO-ZABHA-NEXT: ret 10772 %1 = atomicrmw xchg ptr %a, i16 0 release 10773 ret i16 %1 10774} 10775 10776define i16 @atomicrmw_xchg_0_i16_acq_rel(ptr %a) nounwind { 10777; RV32I-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10778; RV32I: # %bb.0: 10779; RV32I-NEXT: addi sp, sp, -16 10780; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10781; RV32I-NEXT: li a2, 4 10782; RV32I-NEXT: li a1, 0 10783; RV32I-NEXT: call __atomic_exchange_2 10784; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10785; RV32I-NEXT: addi sp, sp, 16 10786; RV32I-NEXT: ret 10787; 10788; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10789; RV32IA-WMO: # %bb.0: 10790; RV32IA-WMO-NEXT: andi a1, a0, -4 10791; RV32IA-WMO-NEXT: slli a0, a0, 3 10792; RV32IA-WMO-NEXT: lui a2, 16 10793; RV32IA-WMO-NEXT: addi a2, a2, -1 10794; RV32IA-WMO-NEXT: sll a2, a2, a0 10795; RV32IA-WMO-NEXT: not a2, a2 10796; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1) 10797; RV32IA-WMO-NEXT: srl a0, a1, a0 10798; RV32IA-WMO-NEXT: ret 10799; 10800; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10801; RV32IA-TSO: # %bb.0: 10802; RV32IA-TSO-NEXT: andi a1, a0, -4 10803; RV32IA-TSO-NEXT: slli a0, a0, 3 10804; RV32IA-TSO-NEXT: lui a2, 16 10805; RV32IA-TSO-NEXT: addi a2, a2, -1 10806; RV32IA-TSO-NEXT: sll a2, a2, a0 10807; RV32IA-TSO-NEXT: not a2, a2 10808; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 10809; RV32IA-TSO-NEXT: srl a0, a1, a0 10810; RV32IA-TSO-NEXT: ret 10811; 10812; RV64I-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10813; RV64I: # %bb.0: 10814; RV64I-NEXT: addi sp, sp, -16 10815; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10816; RV64I-NEXT: li a2, 4 10817; RV64I-NEXT: li a1, 0 10818; RV64I-NEXT: call __atomic_exchange_2 10819; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10820; RV64I-NEXT: addi sp, sp, 16 10821; RV64I-NEXT: ret 10822; 10823; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10824; RV64IA-WMO-NOZACAS: # %bb.0: 10825; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 10826; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 10827; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 10828; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 10829; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 10830; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 10831; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 10832; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 10833; RV64IA-WMO-NOZACAS-NEXT: ret 10834; 10835; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10836; RV64IA-TSO-NOZACAS: # %bb.0: 10837; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 10838; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 10839; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 10840; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 10841; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 10842; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 10843; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 10844; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 10845; RV64IA-TSO-NOZACAS-NEXT: ret 10846; 10847; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10848; RV64IA-WMO-ZACAS: # %bb.0: 10849; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 10850; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10851; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 10852; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 10853; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 10854; RV64IA-WMO-ZACAS-NEXT: not a2, a2 10855; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 10856; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 10857; RV64IA-WMO-ZACAS-NEXT: ret 10858; 10859; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10860; RV64IA-TSO-ZACAS: # %bb.0: 10861; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 10862; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10863; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 10864; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 10865; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 10866; RV64IA-TSO-ZACAS-NEXT: not a2, a2 10867; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 10868; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 10869; RV64IA-TSO-ZACAS-NEXT: ret 10870; 10871; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10872; RV64IA-WMO-ZABHA: # %bb.0: 10873; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, zero, (a0) 10874; RV64IA-WMO-ZABHA-NEXT: ret 10875; 10876; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acq_rel: 10877; RV64IA-TSO-ZABHA: # %bb.0: 10878; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0) 10879; RV64IA-TSO-ZABHA-NEXT: ret 10880 %1 = atomicrmw xchg ptr %a, i16 0 acq_rel 10881 ret i16 %1 10882} 10883 10884define i16 @atomicrmw_xchg_0_i16_seq_cst(ptr %a) nounwind { 10885; RV32I-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10886; RV32I: # %bb.0: 10887; RV32I-NEXT: addi sp, sp, -16 10888; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10889; RV32I-NEXT: li a2, 5 10890; RV32I-NEXT: li a1, 0 10891; RV32I-NEXT: call __atomic_exchange_2 10892; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10893; RV32I-NEXT: addi sp, sp, 16 10894; RV32I-NEXT: ret 10895; 10896; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10897; RV32IA-WMO: # %bb.0: 10898; RV32IA-WMO-NEXT: andi a1, a0, -4 10899; RV32IA-WMO-NEXT: slli a0, a0, 3 10900; RV32IA-WMO-NEXT: lui a2, 16 10901; RV32IA-WMO-NEXT: addi a2, a2, -1 10902; RV32IA-WMO-NEXT: sll a2, a2, a0 10903; RV32IA-WMO-NEXT: not a2, a2 10904; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1) 10905; RV32IA-WMO-NEXT: srl a0, a1, a0 10906; RV32IA-WMO-NEXT: ret 10907; 10908; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10909; RV32IA-TSO: # %bb.0: 10910; RV32IA-TSO-NEXT: andi a1, a0, -4 10911; RV32IA-TSO-NEXT: slli a0, a0, 3 10912; RV32IA-TSO-NEXT: lui a2, 16 10913; RV32IA-TSO-NEXT: addi a2, a2, -1 10914; RV32IA-TSO-NEXT: sll a2, a2, a0 10915; RV32IA-TSO-NEXT: not a2, a2 10916; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1) 10917; RV32IA-TSO-NEXT: srl a0, a1, a0 10918; RV32IA-TSO-NEXT: ret 10919; 10920; RV64I-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10921; RV64I: # %bb.0: 10922; RV64I-NEXT: addi sp, sp, -16 10923; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 10924; RV64I-NEXT: li a2, 5 10925; RV64I-NEXT: li a1, 0 10926; RV64I-NEXT: call __atomic_exchange_2 10927; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 10928; RV64I-NEXT: addi sp, sp, 16 10929; RV64I-NEXT: ret 10930; 10931; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10932; RV64IA-WMO-NOZACAS: # %bb.0: 10933; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 10934; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 10935; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 10936; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 10937; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 10938; RV64IA-WMO-NOZACAS-NEXT: not a2, a2 10939; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 10940; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 10941; RV64IA-WMO-NOZACAS-NEXT: ret 10942; 10943; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10944; RV64IA-TSO-NOZACAS: # %bb.0: 10945; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 10946; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 10947; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 10948; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 10949; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 10950; RV64IA-TSO-NOZACAS-NEXT: not a2, a2 10951; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1) 10952; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 10953; RV64IA-TSO-NOZACAS-NEXT: ret 10954; 10955; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10956; RV64IA-WMO-ZACAS: # %bb.0: 10957; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 10958; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 10959; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 10960; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 10961; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 10962; RV64IA-WMO-ZACAS-NEXT: not a2, a2 10963; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1) 10964; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 10965; RV64IA-WMO-ZACAS-NEXT: ret 10966; 10967; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10968; RV64IA-TSO-ZACAS: # %bb.0: 10969; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 10970; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 10971; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 10972; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 10973; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 10974; RV64IA-TSO-ZACAS-NEXT: not a2, a2 10975; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1) 10976; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 10977; RV64IA-TSO-ZACAS-NEXT: ret 10978; 10979; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10980; RV64IA-WMO-ZABHA: # %bb.0: 10981; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, zero, (a0) 10982; RV64IA-WMO-ZABHA-NEXT: ret 10983; 10984; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_seq_cst: 10985; RV64IA-TSO-ZABHA: # %bb.0: 10986; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0) 10987; RV64IA-TSO-ZABHA-NEXT: ret 10988 %1 = atomicrmw xchg ptr %a, i16 0 seq_cst 10989 ret i16 %1 10990} 10991 10992define i16 @atomicrmw_xchg_minus_1_i16_monotonic(ptr %a) nounwind { 10993; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 10994; RV32I: # %bb.0: 10995; RV32I-NEXT: addi sp, sp, -16 10996; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10997; RV32I-NEXT: lui a1, 16 10998; RV32I-NEXT: addi a1, a1, -1 10999; RV32I-NEXT: li a2, 0 11000; RV32I-NEXT: call __atomic_exchange_2 11001; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11002; RV32I-NEXT: addi sp, sp, 16 11003; RV32I-NEXT: ret 11004; 11005; RV32IA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 11006; RV32IA: # %bb.0: 11007; RV32IA-NEXT: andi a1, a0, -4 11008; RV32IA-NEXT: slli a0, a0, 3 11009; RV32IA-NEXT: lui a2, 16 11010; RV32IA-NEXT: addi a2, a2, -1 11011; RV32IA-NEXT: sll a2, a2, a0 11012; RV32IA-NEXT: amoor.w a1, a2, (a1) 11013; RV32IA-NEXT: srl a0, a1, a0 11014; RV32IA-NEXT: ret 11015; 11016; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 11017; RV64I: # %bb.0: 11018; RV64I-NEXT: addi sp, sp, -16 11019; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11020; RV64I-NEXT: lui a1, 16 11021; RV64I-NEXT: addiw a1, a1, -1 11022; RV64I-NEXT: li a2, 0 11023; RV64I-NEXT: call __atomic_exchange_2 11024; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11025; RV64I-NEXT: addi sp, sp, 16 11026; RV64I-NEXT: ret 11027; 11028; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 11029; RV64IA-NOZACAS: # %bb.0: 11030; RV64IA-NOZACAS-NEXT: andi a1, a0, -4 11031; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 11032; RV64IA-NOZACAS-NEXT: lui a2, 16 11033; RV64IA-NOZACAS-NEXT: addi a2, a2, -1 11034; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0 11035; RV64IA-NOZACAS-NEXT: amoor.w a1, a2, (a1) 11036; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 11037; RV64IA-NOZACAS-NEXT: ret 11038; 11039; RV64IA-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 11040; RV64IA-ZACAS: # %bb.0: 11041; RV64IA-ZACAS-NEXT: andi a1, a0, -4 11042; RV64IA-ZACAS-NEXT: slli a0, a0, 3 11043; RV64IA-ZACAS-NEXT: lui a2, 16 11044; RV64IA-ZACAS-NEXT: addi a2, a2, -1 11045; RV64IA-ZACAS-NEXT: sllw a2, a2, a0 11046; RV64IA-ZACAS-NEXT: amoor.w a1, a2, (a1) 11047; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 11048; RV64IA-ZACAS-NEXT: ret 11049; 11050; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 11051; RV64IA-WMO-ZABHA: # %bb.0: 11052; RV64IA-WMO-ZABHA-NEXT: li a1, -1 11053; RV64IA-WMO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 11054; RV64IA-WMO-ZABHA-NEXT: ret 11055; 11056; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic: 11057; RV64IA-TSO-ZABHA: # %bb.0: 11058; RV64IA-TSO-ZABHA-NEXT: li a1, -1 11059; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 11060; RV64IA-TSO-ZABHA-NEXT: ret 11061 %1 = atomicrmw xchg ptr %a, i16 -1 monotonic 11062 ret i16 %1 11063} 11064 11065define i16 @atomicrmw_xchg_minus_1_i16_acquire(ptr %a) nounwind { 11066; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11067; RV32I: # %bb.0: 11068; RV32I-NEXT: addi sp, sp, -16 11069; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11070; RV32I-NEXT: lui a1, 16 11071; RV32I-NEXT: addi a1, a1, -1 11072; RV32I-NEXT: li a2, 2 11073; RV32I-NEXT: call __atomic_exchange_2 11074; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11075; RV32I-NEXT: addi sp, sp, 16 11076; RV32I-NEXT: ret 11077; 11078; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11079; RV32IA-WMO: # %bb.0: 11080; RV32IA-WMO-NEXT: andi a1, a0, -4 11081; RV32IA-WMO-NEXT: slli a0, a0, 3 11082; RV32IA-WMO-NEXT: lui a2, 16 11083; RV32IA-WMO-NEXT: addi a2, a2, -1 11084; RV32IA-WMO-NEXT: sll a2, a2, a0 11085; RV32IA-WMO-NEXT: amoor.w.aq a1, a2, (a1) 11086; RV32IA-WMO-NEXT: srl a0, a1, a0 11087; RV32IA-WMO-NEXT: ret 11088; 11089; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11090; RV32IA-TSO: # %bb.0: 11091; RV32IA-TSO-NEXT: andi a1, a0, -4 11092; RV32IA-TSO-NEXT: slli a0, a0, 3 11093; RV32IA-TSO-NEXT: lui a2, 16 11094; RV32IA-TSO-NEXT: addi a2, a2, -1 11095; RV32IA-TSO-NEXT: sll a2, a2, a0 11096; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 11097; RV32IA-TSO-NEXT: srl a0, a1, a0 11098; RV32IA-TSO-NEXT: ret 11099; 11100; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11101; RV64I: # %bb.0: 11102; RV64I-NEXT: addi sp, sp, -16 11103; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11104; RV64I-NEXT: lui a1, 16 11105; RV64I-NEXT: addiw a1, a1, -1 11106; RV64I-NEXT: li a2, 2 11107; RV64I-NEXT: call __atomic_exchange_2 11108; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11109; RV64I-NEXT: addi sp, sp, 16 11110; RV64I-NEXT: ret 11111; 11112; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11113; RV64IA-WMO-NOZACAS: # %bb.0: 11114; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 11115; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11116; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 11117; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 11118; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 11119; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a2, (a1) 11120; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 11121; RV64IA-WMO-NOZACAS-NEXT: ret 11122; 11123; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11124; RV64IA-TSO-NOZACAS: # %bb.0: 11125; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 11126; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11127; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 11128; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 11129; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 11130; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 11131; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 11132; RV64IA-TSO-NOZACAS-NEXT: ret 11133; 11134; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11135; RV64IA-WMO-ZACAS: # %bb.0: 11136; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 11137; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 11138; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 11139; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 11140; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 11141; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a2, (a1) 11142; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 11143; RV64IA-WMO-ZACAS-NEXT: ret 11144; 11145; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11146; RV64IA-TSO-ZACAS: # %bb.0: 11147; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 11148; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 11149; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 11150; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 11151; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 11152; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 11153; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 11154; RV64IA-TSO-ZACAS-NEXT: ret 11155; 11156; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11157; RV64IA-WMO-ZABHA: # %bb.0: 11158; RV64IA-WMO-ZABHA-NEXT: li a1, -1 11159; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aq a0, a1, (a0) 11160; RV64IA-WMO-ZABHA-NEXT: ret 11161; 11162; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acquire: 11163; RV64IA-TSO-ZABHA: # %bb.0: 11164; RV64IA-TSO-ZABHA-NEXT: li a1, -1 11165; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 11166; RV64IA-TSO-ZABHA-NEXT: ret 11167 %1 = atomicrmw xchg ptr %a, i16 -1 acquire 11168 ret i16 %1 11169} 11170 11171define i16 @atomicrmw_xchg_minus_1_i16_release(ptr %a) nounwind { 11172; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_release: 11173; RV32I: # %bb.0: 11174; RV32I-NEXT: addi sp, sp, -16 11175; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11176; RV32I-NEXT: lui a1, 16 11177; RV32I-NEXT: addi a1, a1, -1 11178; RV32I-NEXT: li a2, 3 11179; RV32I-NEXT: call __atomic_exchange_2 11180; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11181; RV32I-NEXT: addi sp, sp, 16 11182; RV32I-NEXT: ret 11183; 11184; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_release: 11185; RV32IA-WMO: # %bb.0: 11186; RV32IA-WMO-NEXT: andi a1, a0, -4 11187; RV32IA-WMO-NEXT: slli a0, a0, 3 11188; RV32IA-WMO-NEXT: lui a2, 16 11189; RV32IA-WMO-NEXT: addi a2, a2, -1 11190; RV32IA-WMO-NEXT: sll a2, a2, a0 11191; RV32IA-WMO-NEXT: amoor.w.rl a1, a2, (a1) 11192; RV32IA-WMO-NEXT: srl a0, a1, a0 11193; RV32IA-WMO-NEXT: ret 11194; 11195; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_release: 11196; RV32IA-TSO: # %bb.0: 11197; RV32IA-TSO-NEXT: andi a1, a0, -4 11198; RV32IA-TSO-NEXT: slli a0, a0, 3 11199; RV32IA-TSO-NEXT: lui a2, 16 11200; RV32IA-TSO-NEXT: addi a2, a2, -1 11201; RV32IA-TSO-NEXT: sll a2, a2, a0 11202; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 11203; RV32IA-TSO-NEXT: srl a0, a1, a0 11204; RV32IA-TSO-NEXT: ret 11205; 11206; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_release: 11207; RV64I: # %bb.0: 11208; RV64I-NEXT: addi sp, sp, -16 11209; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11210; RV64I-NEXT: lui a1, 16 11211; RV64I-NEXT: addiw a1, a1, -1 11212; RV64I-NEXT: li a2, 3 11213; RV64I-NEXT: call __atomic_exchange_2 11214; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11215; RV64I-NEXT: addi sp, sp, 16 11216; RV64I-NEXT: ret 11217; 11218; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release: 11219; RV64IA-WMO-NOZACAS: # %bb.0: 11220; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 11221; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11222; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 11223; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 11224; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 11225; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a2, (a1) 11226; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 11227; RV64IA-WMO-NOZACAS-NEXT: ret 11228; 11229; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release: 11230; RV64IA-TSO-NOZACAS: # %bb.0: 11231; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 11232; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11233; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 11234; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 11235; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 11236; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 11237; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 11238; RV64IA-TSO-NOZACAS-NEXT: ret 11239; 11240; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release: 11241; RV64IA-WMO-ZACAS: # %bb.0: 11242; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 11243; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 11244; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 11245; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 11246; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 11247; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a2, (a1) 11248; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 11249; RV64IA-WMO-ZACAS-NEXT: ret 11250; 11251; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release: 11252; RV64IA-TSO-ZACAS: # %bb.0: 11253; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 11254; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 11255; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 11256; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 11257; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 11258; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 11259; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 11260; RV64IA-TSO-ZACAS-NEXT: ret 11261; 11262; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_release: 11263; RV64IA-WMO-ZABHA: # %bb.0: 11264; RV64IA-WMO-ZABHA-NEXT: li a1, -1 11265; RV64IA-WMO-ZABHA-NEXT: amoswap.h.rl a0, a1, (a0) 11266; RV64IA-WMO-ZABHA-NEXT: ret 11267; 11268; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_release: 11269; RV64IA-TSO-ZABHA: # %bb.0: 11270; RV64IA-TSO-ZABHA-NEXT: li a1, -1 11271; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 11272; RV64IA-TSO-ZABHA-NEXT: ret 11273 %1 = atomicrmw xchg ptr %a, i16 -1 release 11274 ret i16 %1 11275} 11276 11277define i16 @atomicrmw_xchg_minus_1_i16_acq_rel(ptr %a) nounwind { 11278; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11279; RV32I: # %bb.0: 11280; RV32I-NEXT: addi sp, sp, -16 11281; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11282; RV32I-NEXT: lui a1, 16 11283; RV32I-NEXT: addi a1, a1, -1 11284; RV32I-NEXT: li a2, 4 11285; RV32I-NEXT: call __atomic_exchange_2 11286; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11287; RV32I-NEXT: addi sp, sp, 16 11288; RV32I-NEXT: ret 11289; 11290; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11291; RV32IA-WMO: # %bb.0: 11292; RV32IA-WMO-NEXT: andi a1, a0, -4 11293; RV32IA-WMO-NEXT: slli a0, a0, 3 11294; RV32IA-WMO-NEXT: lui a2, 16 11295; RV32IA-WMO-NEXT: addi a2, a2, -1 11296; RV32IA-WMO-NEXT: sll a2, a2, a0 11297; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1) 11298; RV32IA-WMO-NEXT: srl a0, a1, a0 11299; RV32IA-WMO-NEXT: ret 11300; 11301; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11302; RV32IA-TSO: # %bb.0: 11303; RV32IA-TSO-NEXT: andi a1, a0, -4 11304; RV32IA-TSO-NEXT: slli a0, a0, 3 11305; RV32IA-TSO-NEXT: lui a2, 16 11306; RV32IA-TSO-NEXT: addi a2, a2, -1 11307; RV32IA-TSO-NEXT: sll a2, a2, a0 11308; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 11309; RV32IA-TSO-NEXT: srl a0, a1, a0 11310; RV32IA-TSO-NEXT: ret 11311; 11312; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11313; RV64I: # %bb.0: 11314; RV64I-NEXT: addi sp, sp, -16 11315; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11316; RV64I-NEXT: lui a1, 16 11317; RV64I-NEXT: addiw a1, a1, -1 11318; RV64I-NEXT: li a2, 4 11319; RV64I-NEXT: call __atomic_exchange_2 11320; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11321; RV64I-NEXT: addi sp, sp, 16 11322; RV64I-NEXT: ret 11323; 11324; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11325; RV64IA-WMO-NOZACAS: # %bb.0: 11326; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 11327; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11328; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 11329; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 11330; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 11331; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 11332; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 11333; RV64IA-WMO-NOZACAS-NEXT: ret 11334; 11335; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11336; RV64IA-TSO-NOZACAS: # %bb.0: 11337; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 11338; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11339; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 11340; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 11341; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 11342; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 11343; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 11344; RV64IA-TSO-NOZACAS-NEXT: ret 11345; 11346; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11347; RV64IA-WMO-ZACAS: # %bb.0: 11348; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 11349; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 11350; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 11351; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 11352; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 11353; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 11354; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 11355; RV64IA-WMO-ZACAS-NEXT: ret 11356; 11357; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11358; RV64IA-TSO-ZACAS: # %bb.0: 11359; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 11360; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 11361; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 11362; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 11363; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 11364; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 11365; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 11366; RV64IA-TSO-ZACAS-NEXT: ret 11367; 11368; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11369; RV64IA-WMO-ZABHA: # %bb.0: 11370; RV64IA-WMO-ZABHA-NEXT: li a1, -1 11371; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0) 11372; RV64IA-WMO-ZABHA-NEXT: ret 11373; 11374; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel: 11375; RV64IA-TSO-ZABHA: # %bb.0: 11376; RV64IA-TSO-ZABHA-NEXT: li a1, -1 11377; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 11378; RV64IA-TSO-ZABHA-NEXT: ret 11379 %1 = atomicrmw xchg ptr %a, i16 -1 acq_rel 11380 ret i16 %1 11381} 11382 11383define i16 @atomicrmw_xchg_minus_1_i16_seq_cst(ptr %a) nounwind { 11384; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11385; RV32I: # %bb.0: 11386; RV32I-NEXT: addi sp, sp, -16 11387; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11388; RV32I-NEXT: lui a1, 16 11389; RV32I-NEXT: addi a1, a1, -1 11390; RV32I-NEXT: li a2, 5 11391; RV32I-NEXT: call __atomic_exchange_2 11392; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11393; RV32I-NEXT: addi sp, sp, 16 11394; RV32I-NEXT: ret 11395; 11396; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11397; RV32IA-WMO: # %bb.0: 11398; RV32IA-WMO-NEXT: andi a1, a0, -4 11399; RV32IA-WMO-NEXT: slli a0, a0, 3 11400; RV32IA-WMO-NEXT: lui a2, 16 11401; RV32IA-WMO-NEXT: addi a2, a2, -1 11402; RV32IA-WMO-NEXT: sll a2, a2, a0 11403; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1) 11404; RV32IA-WMO-NEXT: srl a0, a1, a0 11405; RV32IA-WMO-NEXT: ret 11406; 11407; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11408; RV32IA-TSO: # %bb.0: 11409; RV32IA-TSO-NEXT: andi a1, a0, -4 11410; RV32IA-TSO-NEXT: slli a0, a0, 3 11411; RV32IA-TSO-NEXT: lui a2, 16 11412; RV32IA-TSO-NEXT: addi a2, a2, -1 11413; RV32IA-TSO-NEXT: sll a2, a2, a0 11414; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1) 11415; RV32IA-TSO-NEXT: srl a0, a1, a0 11416; RV32IA-TSO-NEXT: ret 11417; 11418; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11419; RV64I: # %bb.0: 11420; RV64I-NEXT: addi sp, sp, -16 11421; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11422; RV64I-NEXT: lui a1, 16 11423; RV64I-NEXT: addiw a1, a1, -1 11424; RV64I-NEXT: li a2, 5 11425; RV64I-NEXT: call __atomic_exchange_2 11426; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11427; RV64I-NEXT: addi sp, sp, 16 11428; RV64I-NEXT: ret 11429; 11430; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11431; RV64IA-WMO-NOZACAS: # %bb.0: 11432; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4 11433; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11434; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16 11435; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1 11436; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0 11437; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 11438; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 11439; RV64IA-WMO-NOZACAS-NEXT: ret 11440; 11441; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11442; RV64IA-TSO-NOZACAS: # %bb.0: 11443; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4 11444; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11445; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16 11446; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1 11447; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0 11448; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1) 11449; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 11450; RV64IA-TSO-NOZACAS-NEXT: ret 11451; 11452; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11453; RV64IA-WMO-ZACAS: # %bb.0: 11454; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4 11455; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 11456; RV64IA-WMO-ZACAS-NEXT: lui a2, 16 11457; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1 11458; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0 11459; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1) 11460; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 11461; RV64IA-WMO-ZACAS-NEXT: ret 11462; 11463; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11464; RV64IA-TSO-ZACAS: # %bb.0: 11465; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4 11466; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 11467; RV64IA-TSO-ZACAS-NEXT: lui a2, 16 11468; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1 11469; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0 11470; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1) 11471; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 11472; RV64IA-TSO-ZACAS-NEXT: ret 11473; 11474; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11475; RV64IA-WMO-ZABHA: # %bb.0: 11476; RV64IA-WMO-ZABHA-NEXT: li a1, -1 11477; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0) 11478; RV64IA-WMO-ZABHA-NEXT: ret 11479; 11480; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst: 11481; RV64IA-TSO-ZABHA: # %bb.0: 11482; RV64IA-TSO-ZABHA-NEXT: li a1, -1 11483; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0) 11484; RV64IA-TSO-ZABHA-NEXT: ret 11485 %1 = atomicrmw xchg ptr %a, i16 -1 seq_cst 11486 ret i16 %1 11487} 11488 11489define i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind { 11490; RV32I-LABEL: atomicrmw_add_i16_monotonic: 11491; RV32I: # %bb.0: 11492; RV32I-NEXT: addi sp, sp, -16 11493; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11494; RV32I-NEXT: li a2, 0 11495; RV32I-NEXT: call __atomic_fetch_add_2 11496; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11497; RV32I-NEXT: addi sp, sp, 16 11498; RV32I-NEXT: ret 11499; 11500; RV32IA-LABEL: atomicrmw_add_i16_monotonic: 11501; RV32IA: # %bb.0: 11502; RV32IA-NEXT: andi a2, a0, -4 11503; RV32IA-NEXT: slli a0, a0, 3 11504; RV32IA-NEXT: lui a3, 16 11505; RV32IA-NEXT: addi a3, a3, -1 11506; RV32IA-NEXT: sll a4, a3, a0 11507; RV32IA-NEXT: and a1, a1, a3 11508; RV32IA-NEXT: sll a1, a1, a0 11509; RV32IA-NEXT: .LBB80_1: # =>This Inner Loop Header: Depth=1 11510; RV32IA-NEXT: lr.w a3, (a2) 11511; RV32IA-NEXT: add a5, a3, a1 11512; RV32IA-NEXT: xor a5, a3, a5 11513; RV32IA-NEXT: and a5, a5, a4 11514; RV32IA-NEXT: xor a5, a3, a5 11515; RV32IA-NEXT: sc.w a5, a5, (a2) 11516; RV32IA-NEXT: bnez a5, .LBB80_1 11517; RV32IA-NEXT: # %bb.2: 11518; RV32IA-NEXT: srl a0, a3, a0 11519; RV32IA-NEXT: ret 11520; 11521; RV64I-LABEL: atomicrmw_add_i16_monotonic: 11522; RV64I: # %bb.0: 11523; RV64I-NEXT: addi sp, sp, -16 11524; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11525; RV64I-NEXT: li a2, 0 11526; RV64I-NEXT: call __atomic_fetch_add_2 11527; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11528; RV64I-NEXT: addi sp, sp, 16 11529; RV64I-NEXT: ret 11530; 11531; RV64IA-NOZACAS-LABEL: atomicrmw_add_i16_monotonic: 11532; RV64IA-NOZACAS: # %bb.0: 11533; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 11534; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 11535; RV64IA-NOZACAS-NEXT: lui a3, 16 11536; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 11537; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 11538; RV64IA-NOZACAS-NEXT: and a1, a1, a3 11539; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 11540; RV64IA-NOZACAS-NEXT: .LBB80_1: # =>This Inner Loop Header: Depth=1 11541; RV64IA-NOZACAS-NEXT: lr.w a3, (a2) 11542; RV64IA-NOZACAS-NEXT: add a5, a3, a1 11543; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 11544; RV64IA-NOZACAS-NEXT: and a5, a5, a4 11545; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 11546; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 11547; RV64IA-NOZACAS-NEXT: bnez a5, .LBB80_1 11548; RV64IA-NOZACAS-NEXT: # %bb.2: 11549; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 11550; RV64IA-NOZACAS-NEXT: ret 11551; 11552; RV64IA-ZACAS-LABEL: atomicrmw_add_i16_monotonic: 11553; RV64IA-ZACAS: # %bb.0: 11554; RV64IA-ZACAS-NEXT: andi a2, a0, -4 11555; RV64IA-ZACAS-NEXT: slli a0, a0, 3 11556; RV64IA-ZACAS-NEXT: lui a3, 16 11557; RV64IA-ZACAS-NEXT: addi a3, a3, -1 11558; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 11559; RV64IA-ZACAS-NEXT: and a1, a1, a3 11560; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 11561; RV64IA-ZACAS-NEXT: .LBB80_1: # =>This Inner Loop Header: Depth=1 11562; RV64IA-ZACAS-NEXT: lr.w a3, (a2) 11563; RV64IA-ZACAS-NEXT: add a5, a3, a1 11564; RV64IA-ZACAS-NEXT: xor a5, a3, a5 11565; RV64IA-ZACAS-NEXT: and a5, a5, a4 11566; RV64IA-ZACAS-NEXT: xor a5, a3, a5 11567; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 11568; RV64IA-ZACAS-NEXT: bnez a5, .LBB80_1 11569; RV64IA-ZACAS-NEXT: # %bb.2: 11570; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 11571; RV64IA-ZACAS-NEXT: ret 11572; 11573; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_monotonic: 11574; RV64IA-WMO-ZABHA: # %bb.0: 11575; RV64IA-WMO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 11576; RV64IA-WMO-ZABHA-NEXT: ret 11577; 11578; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_monotonic: 11579; RV64IA-TSO-ZABHA: # %bb.0: 11580; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 11581; RV64IA-TSO-ZABHA-NEXT: ret 11582 %1 = atomicrmw add ptr %a, i16 %b monotonic 11583 ret i16 %1 11584} 11585 11586define i16 @atomicrmw_add_i16_acquire(ptr %a, i16 %b) nounwind { 11587; RV32I-LABEL: atomicrmw_add_i16_acquire: 11588; RV32I: # %bb.0: 11589; RV32I-NEXT: addi sp, sp, -16 11590; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11591; RV32I-NEXT: li a2, 2 11592; RV32I-NEXT: call __atomic_fetch_add_2 11593; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11594; RV32I-NEXT: addi sp, sp, 16 11595; RV32I-NEXT: ret 11596; 11597; RV32IA-WMO-LABEL: atomicrmw_add_i16_acquire: 11598; RV32IA-WMO: # %bb.0: 11599; RV32IA-WMO-NEXT: andi a2, a0, -4 11600; RV32IA-WMO-NEXT: slli a0, a0, 3 11601; RV32IA-WMO-NEXT: lui a3, 16 11602; RV32IA-WMO-NEXT: addi a3, a3, -1 11603; RV32IA-WMO-NEXT: sll a4, a3, a0 11604; RV32IA-WMO-NEXT: and a1, a1, a3 11605; RV32IA-WMO-NEXT: sll a1, a1, a0 11606; RV32IA-WMO-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1 11607; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 11608; RV32IA-WMO-NEXT: add a5, a3, a1 11609; RV32IA-WMO-NEXT: xor a5, a3, a5 11610; RV32IA-WMO-NEXT: and a5, a5, a4 11611; RV32IA-WMO-NEXT: xor a5, a3, a5 11612; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 11613; RV32IA-WMO-NEXT: bnez a5, .LBB81_1 11614; RV32IA-WMO-NEXT: # %bb.2: 11615; RV32IA-WMO-NEXT: srl a0, a3, a0 11616; RV32IA-WMO-NEXT: ret 11617; 11618; RV32IA-TSO-LABEL: atomicrmw_add_i16_acquire: 11619; RV32IA-TSO: # %bb.0: 11620; RV32IA-TSO-NEXT: andi a2, a0, -4 11621; RV32IA-TSO-NEXT: slli a0, a0, 3 11622; RV32IA-TSO-NEXT: lui a3, 16 11623; RV32IA-TSO-NEXT: addi a3, a3, -1 11624; RV32IA-TSO-NEXT: sll a4, a3, a0 11625; RV32IA-TSO-NEXT: and a1, a1, a3 11626; RV32IA-TSO-NEXT: sll a1, a1, a0 11627; RV32IA-TSO-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1 11628; RV32IA-TSO-NEXT: lr.w a3, (a2) 11629; RV32IA-TSO-NEXT: add a5, a3, a1 11630; RV32IA-TSO-NEXT: xor a5, a3, a5 11631; RV32IA-TSO-NEXT: and a5, a5, a4 11632; RV32IA-TSO-NEXT: xor a5, a3, a5 11633; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 11634; RV32IA-TSO-NEXT: bnez a5, .LBB81_1 11635; RV32IA-TSO-NEXT: # %bb.2: 11636; RV32IA-TSO-NEXT: srl a0, a3, a0 11637; RV32IA-TSO-NEXT: ret 11638; 11639; RV64I-LABEL: atomicrmw_add_i16_acquire: 11640; RV64I: # %bb.0: 11641; RV64I-NEXT: addi sp, sp, -16 11642; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11643; RV64I-NEXT: li a2, 2 11644; RV64I-NEXT: call __atomic_fetch_add_2 11645; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11646; RV64I-NEXT: addi sp, sp, 16 11647; RV64I-NEXT: ret 11648; 11649; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_acquire: 11650; RV64IA-WMO-NOZACAS: # %bb.0: 11651; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 11652; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11653; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 11654; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 11655; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 11656; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 11657; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 11658; RV64IA-WMO-NOZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1 11659; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 11660; RV64IA-WMO-NOZACAS-NEXT: add a5, a3, a1 11661; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 11662; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 11663; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 11664; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 11665; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB81_1 11666; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 11667; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 11668; RV64IA-WMO-NOZACAS-NEXT: ret 11669; 11670; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_acquire: 11671; RV64IA-TSO-NOZACAS: # %bb.0: 11672; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 11673; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11674; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 11675; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 11676; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 11677; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 11678; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 11679; RV64IA-TSO-NOZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1 11680; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 11681; RV64IA-TSO-NOZACAS-NEXT: add a5, a3, a1 11682; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 11683; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 11684; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 11685; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 11686; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB81_1 11687; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 11688; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 11689; RV64IA-TSO-NOZACAS-NEXT: ret 11690; 11691; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_acquire: 11692; RV64IA-WMO-ZACAS: # %bb.0: 11693; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 11694; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 11695; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 11696; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 11697; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 11698; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 11699; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 11700; RV64IA-WMO-ZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1 11701; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 11702; RV64IA-WMO-ZACAS-NEXT: add a5, a3, a1 11703; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 11704; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 11705; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 11706; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 11707; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB81_1 11708; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 11709; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 11710; RV64IA-WMO-ZACAS-NEXT: ret 11711; 11712; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_acquire: 11713; RV64IA-TSO-ZACAS: # %bb.0: 11714; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 11715; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 11716; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 11717; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 11718; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 11719; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 11720; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 11721; RV64IA-TSO-ZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1 11722; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 11723; RV64IA-TSO-ZACAS-NEXT: add a5, a3, a1 11724; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 11725; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 11726; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 11727; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 11728; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB81_1 11729; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 11730; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 11731; RV64IA-TSO-ZACAS-NEXT: ret 11732; 11733; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_acquire: 11734; RV64IA-WMO-ZABHA: # %bb.0: 11735; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aq a0, a1, (a0) 11736; RV64IA-WMO-ZABHA-NEXT: ret 11737; 11738; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_acquire: 11739; RV64IA-TSO-ZABHA: # %bb.0: 11740; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 11741; RV64IA-TSO-ZABHA-NEXT: ret 11742 %1 = atomicrmw add ptr %a, i16 %b acquire 11743 ret i16 %1 11744} 11745 11746define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind { 11747; RV32I-LABEL: atomicrmw_add_i16_release: 11748; RV32I: # %bb.0: 11749; RV32I-NEXT: addi sp, sp, -16 11750; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11751; RV32I-NEXT: li a2, 3 11752; RV32I-NEXT: call __atomic_fetch_add_2 11753; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11754; RV32I-NEXT: addi sp, sp, 16 11755; RV32I-NEXT: ret 11756; 11757; RV32IA-WMO-LABEL: atomicrmw_add_i16_release: 11758; RV32IA-WMO: # %bb.0: 11759; RV32IA-WMO-NEXT: andi a2, a0, -4 11760; RV32IA-WMO-NEXT: slli a0, a0, 3 11761; RV32IA-WMO-NEXT: lui a3, 16 11762; RV32IA-WMO-NEXT: addi a3, a3, -1 11763; RV32IA-WMO-NEXT: sll a4, a3, a0 11764; RV32IA-WMO-NEXT: and a1, a1, a3 11765; RV32IA-WMO-NEXT: sll a1, a1, a0 11766; RV32IA-WMO-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1 11767; RV32IA-WMO-NEXT: lr.w a3, (a2) 11768; RV32IA-WMO-NEXT: add a5, a3, a1 11769; RV32IA-WMO-NEXT: xor a5, a3, a5 11770; RV32IA-WMO-NEXT: and a5, a5, a4 11771; RV32IA-WMO-NEXT: xor a5, a3, a5 11772; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 11773; RV32IA-WMO-NEXT: bnez a5, .LBB82_1 11774; RV32IA-WMO-NEXT: # %bb.2: 11775; RV32IA-WMO-NEXT: srl a0, a3, a0 11776; RV32IA-WMO-NEXT: ret 11777; 11778; RV32IA-TSO-LABEL: atomicrmw_add_i16_release: 11779; RV32IA-TSO: # %bb.0: 11780; RV32IA-TSO-NEXT: andi a2, a0, -4 11781; RV32IA-TSO-NEXT: slli a0, a0, 3 11782; RV32IA-TSO-NEXT: lui a3, 16 11783; RV32IA-TSO-NEXT: addi a3, a3, -1 11784; RV32IA-TSO-NEXT: sll a4, a3, a0 11785; RV32IA-TSO-NEXT: and a1, a1, a3 11786; RV32IA-TSO-NEXT: sll a1, a1, a0 11787; RV32IA-TSO-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1 11788; RV32IA-TSO-NEXT: lr.w a3, (a2) 11789; RV32IA-TSO-NEXT: add a5, a3, a1 11790; RV32IA-TSO-NEXT: xor a5, a3, a5 11791; RV32IA-TSO-NEXT: and a5, a5, a4 11792; RV32IA-TSO-NEXT: xor a5, a3, a5 11793; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 11794; RV32IA-TSO-NEXT: bnez a5, .LBB82_1 11795; RV32IA-TSO-NEXT: # %bb.2: 11796; RV32IA-TSO-NEXT: srl a0, a3, a0 11797; RV32IA-TSO-NEXT: ret 11798; 11799; RV64I-LABEL: atomicrmw_add_i16_release: 11800; RV64I: # %bb.0: 11801; RV64I-NEXT: addi sp, sp, -16 11802; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11803; RV64I-NEXT: li a2, 3 11804; RV64I-NEXT: call __atomic_fetch_add_2 11805; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11806; RV64I-NEXT: addi sp, sp, 16 11807; RV64I-NEXT: ret 11808; 11809; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_release: 11810; RV64IA-WMO-NOZACAS: # %bb.0: 11811; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 11812; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11813; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 11814; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 11815; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 11816; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 11817; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 11818; RV64IA-WMO-NOZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1 11819; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2) 11820; RV64IA-WMO-NOZACAS-NEXT: add a5, a3, a1 11821; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 11822; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 11823; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 11824; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 11825; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB82_1 11826; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 11827; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 11828; RV64IA-WMO-NOZACAS-NEXT: ret 11829; 11830; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_release: 11831; RV64IA-TSO-NOZACAS: # %bb.0: 11832; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 11833; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11834; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 11835; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 11836; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 11837; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 11838; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 11839; RV64IA-TSO-NOZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1 11840; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 11841; RV64IA-TSO-NOZACAS-NEXT: add a5, a3, a1 11842; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 11843; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 11844; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 11845; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 11846; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB82_1 11847; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 11848; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 11849; RV64IA-TSO-NOZACAS-NEXT: ret 11850; 11851; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_release: 11852; RV64IA-WMO-ZACAS: # %bb.0: 11853; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 11854; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 11855; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 11856; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 11857; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 11858; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 11859; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 11860; RV64IA-WMO-ZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1 11861; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2) 11862; RV64IA-WMO-ZACAS-NEXT: add a5, a3, a1 11863; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 11864; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 11865; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 11866; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 11867; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB82_1 11868; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 11869; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 11870; RV64IA-WMO-ZACAS-NEXT: ret 11871; 11872; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_release: 11873; RV64IA-TSO-ZACAS: # %bb.0: 11874; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 11875; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 11876; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 11877; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 11878; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 11879; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 11880; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 11881; RV64IA-TSO-ZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1 11882; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 11883; RV64IA-TSO-ZACAS-NEXT: add a5, a3, a1 11884; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 11885; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 11886; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 11887; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 11888; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB82_1 11889; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 11890; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 11891; RV64IA-TSO-ZACAS-NEXT: ret 11892; 11893; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_release: 11894; RV64IA-WMO-ZABHA: # %bb.0: 11895; RV64IA-WMO-ZABHA-NEXT: amoadd.h.rl a0, a1, (a0) 11896; RV64IA-WMO-ZABHA-NEXT: ret 11897; 11898; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_release: 11899; RV64IA-TSO-ZABHA: # %bb.0: 11900; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 11901; RV64IA-TSO-ZABHA-NEXT: ret 11902 %1 = atomicrmw add ptr %a, i16 %b release 11903 ret i16 %1 11904} 11905 11906define i16 @atomicrmw_add_i16_acq_rel(ptr %a, i16 %b) nounwind { 11907; RV32I-LABEL: atomicrmw_add_i16_acq_rel: 11908; RV32I: # %bb.0: 11909; RV32I-NEXT: addi sp, sp, -16 11910; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 11911; RV32I-NEXT: li a2, 4 11912; RV32I-NEXT: call __atomic_fetch_add_2 11913; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11914; RV32I-NEXT: addi sp, sp, 16 11915; RV32I-NEXT: ret 11916; 11917; RV32IA-WMO-LABEL: atomicrmw_add_i16_acq_rel: 11918; RV32IA-WMO: # %bb.0: 11919; RV32IA-WMO-NEXT: andi a2, a0, -4 11920; RV32IA-WMO-NEXT: slli a0, a0, 3 11921; RV32IA-WMO-NEXT: lui a3, 16 11922; RV32IA-WMO-NEXT: addi a3, a3, -1 11923; RV32IA-WMO-NEXT: sll a4, a3, a0 11924; RV32IA-WMO-NEXT: and a1, a1, a3 11925; RV32IA-WMO-NEXT: sll a1, a1, a0 11926; RV32IA-WMO-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1 11927; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 11928; RV32IA-WMO-NEXT: add a5, a3, a1 11929; RV32IA-WMO-NEXT: xor a5, a3, a5 11930; RV32IA-WMO-NEXT: and a5, a5, a4 11931; RV32IA-WMO-NEXT: xor a5, a3, a5 11932; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 11933; RV32IA-WMO-NEXT: bnez a5, .LBB83_1 11934; RV32IA-WMO-NEXT: # %bb.2: 11935; RV32IA-WMO-NEXT: srl a0, a3, a0 11936; RV32IA-WMO-NEXT: ret 11937; 11938; RV32IA-TSO-LABEL: atomicrmw_add_i16_acq_rel: 11939; RV32IA-TSO: # %bb.0: 11940; RV32IA-TSO-NEXT: andi a2, a0, -4 11941; RV32IA-TSO-NEXT: slli a0, a0, 3 11942; RV32IA-TSO-NEXT: lui a3, 16 11943; RV32IA-TSO-NEXT: addi a3, a3, -1 11944; RV32IA-TSO-NEXT: sll a4, a3, a0 11945; RV32IA-TSO-NEXT: and a1, a1, a3 11946; RV32IA-TSO-NEXT: sll a1, a1, a0 11947; RV32IA-TSO-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1 11948; RV32IA-TSO-NEXT: lr.w a3, (a2) 11949; RV32IA-TSO-NEXT: add a5, a3, a1 11950; RV32IA-TSO-NEXT: xor a5, a3, a5 11951; RV32IA-TSO-NEXT: and a5, a5, a4 11952; RV32IA-TSO-NEXT: xor a5, a3, a5 11953; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 11954; RV32IA-TSO-NEXT: bnez a5, .LBB83_1 11955; RV32IA-TSO-NEXT: # %bb.2: 11956; RV32IA-TSO-NEXT: srl a0, a3, a0 11957; RV32IA-TSO-NEXT: ret 11958; 11959; RV64I-LABEL: atomicrmw_add_i16_acq_rel: 11960; RV64I: # %bb.0: 11961; RV64I-NEXT: addi sp, sp, -16 11962; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 11963; RV64I-NEXT: li a2, 4 11964; RV64I-NEXT: call __atomic_fetch_add_2 11965; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 11966; RV64I-NEXT: addi sp, sp, 16 11967; RV64I-NEXT: ret 11968; 11969; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_acq_rel: 11970; RV64IA-WMO-NOZACAS: # %bb.0: 11971; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 11972; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 11973; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 11974; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 11975; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 11976; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 11977; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 11978; RV64IA-WMO-NOZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1 11979; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 11980; RV64IA-WMO-NOZACAS-NEXT: add a5, a3, a1 11981; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 11982; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 11983; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 11984; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 11985; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB83_1 11986; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 11987; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 11988; RV64IA-WMO-NOZACAS-NEXT: ret 11989; 11990; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_acq_rel: 11991; RV64IA-TSO-NOZACAS: # %bb.0: 11992; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 11993; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 11994; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 11995; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 11996; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 11997; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 11998; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 11999; RV64IA-TSO-NOZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1 12000; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 12001; RV64IA-TSO-NOZACAS-NEXT: add a5, a3, a1 12002; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12003; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 12004; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12005; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 12006; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB83_1 12007; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 12008; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 12009; RV64IA-TSO-NOZACAS-NEXT: ret 12010; 12011; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_acq_rel: 12012; RV64IA-WMO-ZACAS: # %bb.0: 12013; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 12014; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 12015; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 12016; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 12017; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 12018; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 12019; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 12020; RV64IA-WMO-ZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1 12021; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 12022; RV64IA-WMO-ZACAS-NEXT: add a5, a3, a1 12023; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12024; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 12025; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12026; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 12027; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB83_1 12028; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 12029; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 12030; RV64IA-WMO-ZACAS-NEXT: ret 12031; 12032; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_acq_rel: 12033; RV64IA-TSO-ZACAS: # %bb.0: 12034; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 12035; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 12036; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 12037; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 12038; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 12039; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 12040; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 12041; RV64IA-TSO-ZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1 12042; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 12043; RV64IA-TSO-ZACAS-NEXT: add a5, a3, a1 12044; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12045; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 12046; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12047; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 12048; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB83_1 12049; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 12050; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 12051; RV64IA-TSO-ZACAS-NEXT: ret 12052; 12053; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_acq_rel: 12054; RV64IA-WMO-ZABHA: # %bb.0: 12055; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0) 12056; RV64IA-WMO-ZABHA-NEXT: ret 12057; 12058; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_acq_rel: 12059; RV64IA-TSO-ZABHA: # %bb.0: 12060; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12061; RV64IA-TSO-ZABHA-NEXT: ret 12062 %1 = atomicrmw add ptr %a, i16 %b acq_rel 12063 ret i16 %1 12064} 12065 12066define i16 @atomicrmw_add_i16_seq_cst(ptr %a, i16 %b) nounwind { 12067; RV32I-LABEL: atomicrmw_add_i16_seq_cst: 12068; RV32I: # %bb.0: 12069; RV32I-NEXT: addi sp, sp, -16 12070; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12071; RV32I-NEXT: li a2, 5 12072; RV32I-NEXT: call __atomic_fetch_add_2 12073; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12074; RV32I-NEXT: addi sp, sp, 16 12075; RV32I-NEXT: ret 12076; 12077; RV32IA-LABEL: atomicrmw_add_i16_seq_cst: 12078; RV32IA: # %bb.0: 12079; RV32IA-NEXT: andi a2, a0, -4 12080; RV32IA-NEXT: slli a0, a0, 3 12081; RV32IA-NEXT: lui a3, 16 12082; RV32IA-NEXT: addi a3, a3, -1 12083; RV32IA-NEXT: sll a4, a3, a0 12084; RV32IA-NEXT: and a1, a1, a3 12085; RV32IA-NEXT: sll a1, a1, a0 12086; RV32IA-NEXT: .LBB84_1: # =>This Inner Loop Header: Depth=1 12087; RV32IA-NEXT: lr.w.aqrl a3, (a2) 12088; RV32IA-NEXT: add a5, a3, a1 12089; RV32IA-NEXT: xor a5, a3, a5 12090; RV32IA-NEXT: and a5, a5, a4 12091; RV32IA-NEXT: xor a5, a3, a5 12092; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 12093; RV32IA-NEXT: bnez a5, .LBB84_1 12094; RV32IA-NEXT: # %bb.2: 12095; RV32IA-NEXT: srl a0, a3, a0 12096; RV32IA-NEXT: ret 12097; 12098; RV64I-LABEL: atomicrmw_add_i16_seq_cst: 12099; RV64I: # %bb.0: 12100; RV64I-NEXT: addi sp, sp, -16 12101; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12102; RV64I-NEXT: li a2, 5 12103; RV64I-NEXT: call __atomic_fetch_add_2 12104; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12105; RV64I-NEXT: addi sp, sp, 16 12106; RV64I-NEXT: ret 12107; 12108; RV64IA-NOZACAS-LABEL: atomicrmw_add_i16_seq_cst: 12109; RV64IA-NOZACAS: # %bb.0: 12110; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 12111; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 12112; RV64IA-NOZACAS-NEXT: lui a3, 16 12113; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 12114; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 12115; RV64IA-NOZACAS-NEXT: and a1, a1, a3 12116; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 12117; RV64IA-NOZACAS-NEXT: .LBB84_1: # =>This Inner Loop Header: Depth=1 12118; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 12119; RV64IA-NOZACAS-NEXT: add a5, a3, a1 12120; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 12121; RV64IA-NOZACAS-NEXT: and a5, a5, a4 12122; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 12123; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 12124; RV64IA-NOZACAS-NEXT: bnez a5, .LBB84_1 12125; RV64IA-NOZACAS-NEXT: # %bb.2: 12126; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 12127; RV64IA-NOZACAS-NEXT: ret 12128; 12129; RV64IA-ZACAS-LABEL: atomicrmw_add_i16_seq_cst: 12130; RV64IA-ZACAS: # %bb.0: 12131; RV64IA-ZACAS-NEXT: andi a2, a0, -4 12132; RV64IA-ZACAS-NEXT: slli a0, a0, 3 12133; RV64IA-ZACAS-NEXT: lui a3, 16 12134; RV64IA-ZACAS-NEXT: addi a3, a3, -1 12135; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 12136; RV64IA-ZACAS-NEXT: and a1, a1, a3 12137; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 12138; RV64IA-ZACAS-NEXT: .LBB84_1: # =>This Inner Loop Header: Depth=1 12139; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2) 12140; RV64IA-ZACAS-NEXT: add a5, a3, a1 12141; RV64IA-ZACAS-NEXT: xor a5, a3, a5 12142; RV64IA-ZACAS-NEXT: and a5, a5, a4 12143; RV64IA-ZACAS-NEXT: xor a5, a3, a5 12144; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 12145; RV64IA-ZACAS-NEXT: bnez a5, .LBB84_1 12146; RV64IA-ZACAS-NEXT: # %bb.2: 12147; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 12148; RV64IA-ZACAS-NEXT: ret 12149; 12150; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_seq_cst: 12151; RV64IA-WMO-ZABHA: # %bb.0: 12152; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0) 12153; RV64IA-WMO-ZABHA-NEXT: ret 12154; 12155; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_seq_cst: 12156; RV64IA-TSO-ZABHA: # %bb.0: 12157; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12158; RV64IA-TSO-ZABHA-NEXT: ret 12159 %1 = atomicrmw add ptr %a, i16 %b seq_cst 12160 ret i16 %1 12161} 12162 12163define i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind { 12164; RV32I-LABEL: atomicrmw_sub_i16_monotonic: 12165; RV32I: # %bb.0: 12166; RV32I-NEXT: addi sp, sp, -16 12167; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12168; RV32I-NEXT: li a2, 0 12169; RV32I-NEXT: call __atomic_fetch_sub_2 12170; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12171; RV32I-NEXT: addi sp, sp, 16 12172; RV32I-NEXT: ret 12173; 12174; RV32IA-LABEL: atomicrmw_sub_i16_monotonic: 12175; RV32IA: # %bb.0: 12176; RV32IA-NEXT: andi a2, a0, -4 12177; RV32IA-NEXT: slli a0, a0, 3 12178; RV32IA-NEXT: lui a3, 16 12179; RV32IA-NEXT: addi a3, a3, -1 12180; RV32IA-NEXT: sll a4, a3, a0 12181; RV32IA-NEXT: and a1, a1, a3 12182; RV32IA-NEXT: sll a1, a1, a0 12183; RV32IA-NEXT: .LBB85_1: # =>This Inner Loop Header: Depth=1 12184; RV32IA-NEXT: lr.w a3, (a2) 12185; RV32IA-NEXT: sub a5, a3, a1 12186; RV32IA-NEXT: xor a5, a3, a5 12187; RV32IA-NEXT: and a5, a5, a4 12188; RV32IA-NEXT: xor a5, a3, a5 12189; RV32IA-NEXT: sc.w a5, a5, (a2) 12190; RV32IA-NEXT: bnez a5, .LBB85_1 12191; RV32IA-NEXT: # %bb.2: 12192; RV32IA-NEXT: srl a0, a3, a0 12193; RV32IA-NEXT: ret 12194; 12195; RV64I-LABEL: atomicrmw_sub_i16_monotonic: 12196; RV64I: # %bb.0: 12197; RV64I-NEXT: addi sp, sp, -16 12198; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12199; RV64I-NEXT: li a2, 0 12200; RV64I-NEXT: call __atomic_fetch_sub_2 12201; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12202; RV64I-NEXT: addi sp, sp, 16 12203; RV64I-NEXT: ret 12204; 12205; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i16_monotonic: 12206; RV64IA-NOZACAS: # %bb.0: 12207; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 12208; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 12209; RV64IA-NOZACAS-NEXT: lui a3, 16 12210; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 12211; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 12212; RV64IA-NOZACAS-NEXT: and a1, a1, a3 12213; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 12214; RV64IA-NOZACAS-NEXT: .LBB85_1: # =>This Inner Loop Header: Depth=1 12215; RV64IA-NOZACAS-NEXT: lr.w a3, (a2) 12216; RV64IA-NOZACAS-NEXT: sub a5, a3, a1 12217; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 12218; RV64IA-NOZACAS-NEXT: and a5, a5, a4 12219; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 12220; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 12221; RV64IA-NOZACAS-NEXT: bnez a5, .LBB85_1 12222; RV64IA-NOZACAS-NEXT: # %bb.2: 12223; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 12224; RV64IA-NOZACAS-NEXT: ret 12225; 12226; RV64IA-ZACAS-LABEL: atomicrmw_sub_i16_monotonic: 12227; RV64IA-ZACAS: # %bb.0: 12228; RV64IA-ZACAS-NEXT: andi a2, a0, -4 12229; RV64IA-ZACAS-NEXT: slli a0, a0, 3 12230; RV64IA-ZACAS-NEXT: lui a3, 16 12231; RV64IA-ZACAS-NEXT: addi a3, a3, -1 12232; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 12233; RV64IA-ZACAS-NEXT: and a1, a1, a3 12234; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 12235; RV64IA-ZACAS-NEXT: .LBB85_1: # =>This Inner Loop Header: Depth=1 12236; RV64IA-ZACAS-NEXT: lr.w a3, (a2) 12237; RV64IA-ZACAS-NEXT: sub a5, a3, a1 12238; RV64IA-ZACAS-NEXT: xor a5, a3, a5 12239; RV64IA-ZACAS-NEXT: and a5, a5, a4 12240; RV64IA-ZACAS-NEXT: xor a5, a3, a5 12241; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 12242; RV64IA-ZACAS-NEXT: bnez a5, .LBB85_1 12243; RV64IA-ZACAS-NEXT: # %bb.2: 12244; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 12245; RV64IA-ZACAS-NEXT: ret 12246; 12247; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_monotonic: 12248; RV64IA-WMO-ZABHA: # %bb.0: 12249; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 12250; RV64IA-WMO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12251; RV64IA-WMO-ZABHA-NEXT: ret 12252; 12253; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_monotonic: 12254; RV64IA-TSO-ZABHA: # %bb.0: 12255; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 12256; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12257; RV64IA-TSO-ZABHA-NEXT: ret 12258 %1 = atomicrmw sub ptr %a, i16 %b monotonic 12259 ret i16 %1 12260} 12261 12262define i16 @atomicrmw_sub_i16_acquire(ptr %a, i16 %b) nounwind { 12263; RV32I-LABEL: atomicrmw_sub_i16_acquire: 12264; RV32I: # %bb.0: 12265; RV32I-NEXT: addi sp, sp, -16 12266; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12267; RV32I-NEXT: li a2, 2 12268; RV32I-NEXT: call __atomic_fetch_sub_2 12269; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12270; RV32I-NEXT: addi sp, sp, 16 12271; RV32I-NEXT: ret 12272; 12273; RV32IA-WMO-LABEL: atomicrmw_sub_i16_acquire: 12274; RV32IA-WMO: # %bb.0: 12275; RV32IA-WMO-NEXT: andi a2, a0, -4 12276; RV32IA-WMO-NEXT: slli a0, a0, 3 12277; RV32IA-WMO-NEXT: lui a3, 16 12278; RV32IA-WMO-NEXT: addi a3, a3, -1 12279; RV32IA-WMO-NEXT: sll a4, a3, a0 12280; RV32IA-WMO-NEXT: and a1, a1, a3 12281; RV32IA-WMO-NEXT: sll a1, a1, a0 12282; RV32IA-WMO-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1 12283; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 12284; RV32IA-WMO-NEXT: sub a5, a3, a1 12285; RV32IA-WMO-NEXT: xor a5, a3, a5 12286; RV32IA-WMO-NEXT: and a5, a5, a4 12287; RV32IA-WMO-NEXT: xor a5, a3, a5 12288; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 12289; RV32IA-WMO-NEXT: bnez a5, .LBB86_1 12290; RV32IA-WMO-NEXT: # %bb.2: 12291; RV32IA-WMO-NEXT: srl a0, a3, a0 12292; RV32IA-WMO-NEXT: ret 12293; 12294; RV32IA-TSO-LABEL: atomicrmw_sub_i16_acquire: 12295; RV32IA-TSO: # %bb.0: 12296; RV32IA-TSO-NEXT: andi a2, a0, -4 12297; RV32IA-TSO-NEXT: slli a0, a0, 3 12298; RV32IA-TSO-NEXT: lui a3, 16 12299; RV32IA-TSO-NEXT: addi a3, a3, -1 12300; RV32IA-TSO-NEXT: sll a4, a3, a0 12301; RV32IA-TSO-NEXT: and a1, a1, a3 12302; RV32IA-TSO-NEXT: sll a1, a1, a0 12303; RV32IA-TSO-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1 12304; RV32IA-TSO-NEXT: lr.w a3, (a2) 12305; RV32IA-TSO-NEXT: sub a5, a3, a1 12306; RV32IA-TSO-NEXT: xor a5, a3, a5 12307; RV32IA-TSO-NEXT: and a5, a5, a4 12308; RV32IA-TSO-NEXT: xor a5, a3, a5 12309; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 12310; RV32IA-TSO-NEXT: bnez a5, .LBB86_1 12311; RV32IA-TSO-NEXT: # %bb.2: 12312; RV32IA-TSO-NEXT: srl a0, a3, a0 12313; RV32IA-TSO-NEXT: ret 12314; 12315; RV64I-LABEL: atomicrmw_sub_i16_acquire: 12316; RV64I: # %bb.0: 12317; RV64I-NEXT: addi sp, sp, -16 12318; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12319; RV64I-NEXT: li a2, 2 12320; RV64I-NEXT: call __atomic_fetch_sub_2 12321; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12322; RV64I-NEXT: addi sp, sp, 16 12323; RV64I-NEXT: ret 12324; 12325; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_acquire: 12326; RV64IA-WMO-NOZACAS: # %bb.0: 12327; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 12328; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 12329; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 12330; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 12331; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 12332; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 12333; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 12334; RV64IA-WMO-NOZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1 12335; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 12336; RV64IA-WMO-NOZACAS-NEXT: sub a5, a3, a1 12337; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 12338; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 12339; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 12340; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 12341; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB86_1 12342; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 12343; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 12344; RV64IA-WMO-NOZACAS-NEXT: ret 12345; 12346; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_acquire: 12347; RV64IA-TSO-NOZACAS: # %bb.0: 12348; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 12349; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 12350; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 12351; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 12352; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 12353; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 12354; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 12355; RV64IA-TSO-NOZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1 12356; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 12357; RV64IA-TSO-NOZACAS-NEXT: sub a5, a3, a1 12358; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12359; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 12360; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12361; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 12362; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB86_1 12363; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 12364; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 12365; RV64IA-TSO-NOZACAS-NEXT: ret 12366; 12367; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_acquire: 12368; RV64IA-WMO-ZACAS: # %bb.0: 12369; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 12370; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 12371; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 12372; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 12373; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 12374; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 12375; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 12376; RV64IA-WMO-ZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1 12377; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 12378; RV64IA-WMO-ZACAS-NEXT: sub a5, a3, a1 12379; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12380; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 12381; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12382; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 12383; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB86_1 12384; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 12385; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 12386; RV64IA-WMO-ZACAS-NEXT: ret 12387; 12388; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_acquire: 12389; RV64IA-TSO-ZACAS: # %bb.0: 12390; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 12391; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 12392; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 12393; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 12394; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 12395; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 12396; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 12397; RV64IA-TSO-ZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1 12398; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 12399; RV64IA-TSO-ZACAS-NEXT: sub a5, a3, a1 12400; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12401; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 12402; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12403; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 12404; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB86_1 12405; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 12406; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 12407; RV64IA-TSO-ZACAS-NEXT: ret 12408; 12409; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_acquire: 12410; RV64IA-WMO-ZABHA: # %bb.0: 12411; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 12412; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aq a0, a1, (a0) 12413; RV64IA-WMO-ZABHA-NEXT: ret 12414; 12415; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_acquire: 12416; RV64IA-TSO-ZABHA: # %bb.0: 12417; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 12418; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12419; RV64IA-TSO-ZABHA-NEXT: ret 12420 %1 = atomicrmw sub ptr %a, i16 %b acquire 12421 ret i16 %1 12422} 12423 12424define i16 @atomicrmw_sub_i16_release(ptr %a, i16 %b) nounwind { 12425; RV32I-LABEL: atomicrmw_sub_i16_release: 12426; RV32I: # %bb.0: 12427; RV32I-NEXT: addi sp, sp, -16 12428; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12429; RV32I-NEXT: li a2, 3 12430; RV32I-NEXT: call __atomic_fetch_sub_2 12431; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12432; RV32I-NEXT: addi sp, sp, 16 12433; RV32I-NEXT: ret 12434; 12435; RV32IA-WMO-LABEL: atomicrmw_sub_i16_release: 12436; RV32IA-WMO: # %bb.0: 12437; RV32IA-WMO-NEXT: andi a2, a0, -4 12438; RV32IA-WMO-NEXT: slli a0, a0, 3 12439; RV32IA-WMO-NEXT: lui a3, 16 12440; RV32IA-WMO-NEXT: addi a3, a3, -1 12441; RV32IA-WMO-NEXT: sll a4, a3, a0 12442; RV32IA-WMO-NEXT: and a1, a1, a3 12443; RV32IA-WMO-NEXT: sll a1, a1, a0 12444; RV32IA-WMO-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1 12445; RV32IA-WMO-NEXT: lr.w a3, (a2) 12446; RV32IA-WMO-NEXT: sub a5, a3, a1 12447; RV32IA-WMO-NEXT: xor a5, a3, a5 12448; RV32IA-WMO-NEXT: and a5, a5, a4 12449; RV32IA-WMO-NEXT: xor a5, a3, a5 12450; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 12451; RV32IA-WMO-NEXT: bnez a5, .LBB87_1 12452; RV32IA-WMO-NEXT: # %bb.2: 12453; RV32IA-WMO-NEXT: srl a0, a3, a0 12454; RV32IA-WMO-NEXT: ret 12455; 12456; RV32IA-TSO-LABEL: atomicrmw_sub_i16_release: 12457; RV32IA-TSO: # %bb.0: 12458; RV32IA-TSO-NEXT: andi a2, a0, -4 12459; RV32IA-TSO-NEXT: slli a0, a0, 3 12460; RV32IA-TSO-NEXT: lui a3, 16 12461; RV32IA-TSO-NEXT: addi a3, a3, -1 12462; RV32IA-TSO-NEXT: sll a4, a3, a0 12463; RV32IA-TSO-NEXT: and a1, a1, a3 12464; RV32IA-TSO-NEXT: sll a1, a1, a0 12465; RV32IA-TSO-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1 12466; RV32IA-TSO-NEXT: lr.w a3, (a2) 12467; RV32IA-TSO-NEXT: sub a5, a3, a1 12468; RV32IA-TSO-NEXT: xor a5, a3, a5 12469; RV32IA-TSO-NEXT: and a5, a5, a4 12470; RV32IA-TSO-NEXT: xor a5, a3, a5 12471; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 12472; RV32IA-TSO-NEXT: bnez a5, .LBB87_1 12473; RV32IA-TSO-NEXT: # %bb.2: 12474; RV32IA-TSO-NEXT: srl a0, a3, a0 12475; RV32IA-TSO-NEXT: ret 12476; 12477; RV64I-LABEL: atomicrmw_sub_i16_release: 12478; RV64I: # %bb.0: 12479; RV64I-NEXT: addi sp, sp, -16 12480; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12481; RV64I-NEXT: li a2, 3 12482; RV64I-NEXT: call __atomic_fetch_sub_2 12483; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12484; RV64I-NEXT: addi sp, sp, 16 12485; RV64I-NEXT: ret 12486; 12487; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_release: 12488; RV64IA-WMO-NOZACAS: # %bb.0: 12489; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 12490; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 12491; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 12492; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 12493; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 12494; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 12495; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 12496; RV64IA-WMO-NOZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1 12497; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2) 12498; RV64IA-WMO-NOZACAS-NEXT: sub a5, a3, a1 12499; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 12500; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 12501; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 12502; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 12503; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB87_1 12504; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 12505; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 12506; RV64IA-WMO-NOZACAS-NEXT: ret 12507; 12508; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_release: 12509; RV64IA-TSO-NOZACAS: # %bb.0: 12510; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 12511; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 12512; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 12513; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 12514; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 12515; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 12516; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 12517; RV64IA-TSO-NOZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1 12518; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 12519; RV64IA-TSO-NOZACAS-NEXT: sub a5, a3, a1 12520; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12521; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 12522; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12523; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 12524; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB87_1 12525; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 12526; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 12527; RV64IA-TSO-NOZACAS-NEXT: ret 12528; 12529; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_release: 12530; RV64IA-WMO-ZACAS: # %bb.0: 12531; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 12532; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 12533; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 12534; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 12535; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 12536; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 12537; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 12538; RV64IA-WMO-ZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1 12539; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2) 12540; RV64IA-WMO-ZACAS-NEXT: sub a5, a3, a1 12541; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12542; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 12543; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12544; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 12545; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB87_1 12546; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 12547; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 12548; RV64IA-WMO-ZACAS-NEXT: ret 12549; 12550; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_release: 12551; RV64IA-TSO-ZACAS: # %bb.0: 12552; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 12553; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 12554; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 12555; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 12556; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 12557; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 12558; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 12559; RV64IA-TSO-ZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1 12560; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 12561; RV64IA-TSO-ZACAS-NEXT: sub a5, a3, a1 12562; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12563; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 12564; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12565; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 12566; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB87_1 12567; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 12568; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 12569; RV64IA-TSO-ZACAS-NEXT: ret 12570; 12571; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_release: 12572; RV64IA-WMO-ZABHA: # %bb.0: 12573; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 12574; RV64IA-WMO-ZABHA-NEXT: amoadd.h.rl a0, a1, (a0) 12575; RV64IA-WMO-ZABHA-NEXT: ret 12576; 12577; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_release: 12578; RV64IA-TSO-ZABHA: # %bb.0: 12579; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 12580; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12581; RV64IA-TSO-ZABHA-NEXT: ret 12582 %1 = atomicrmw sub ptr %a, i16 %b release 12583 ret i16 %1 12584} 12585 12586define i16 @atomicrmw_sub_i16_acq_rel(ptr %a, i16 %b) nounwind { 12587; RV32I-LABEL: atomicrmw_sub_i16_acq_rel: 12588; RV32I: # %bb.0: 12589; RV32I-NEXT: addi sp, sp, -16 12590; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12591; RV32I-NEXT: li a2, 4 12592; RV32I-NEXT: call __atomic_fetch_sub_2 12593; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12594; RV32I-NEXT: addi sp, sp, 16 12595; RV32I-NEXT: ret 12596; 12597; RV32IA-WMO-LABEL: atomicrmw_sub_i16_acq_rel: 12598; RV32IA-WMO: # %bb.0: 12599; RV32IA-WMO-NEXT: andi a2, a0, -4 12600; RV32IA-WMO-NEXT: slli a0, a0, 3 12601; RV32IA-WMO-NEXT: lui a3, 16 12602; RV32IA-WMO-NEXT: addi a3, a3, -1 12603; RV32IA-WMO-NEXT: sll a4, a3, a0 12604; RV32IA-WMO-NEXT: and a1, a1, a3 12605; RV32IA-WMO-NEXT: sll a1, a1, a0 12606; RV32IA-WMO-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1 12607; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 12608; RV32IA-WMO-NEXT: sub a5, a3, a1 12609; RV32IA-WMO-NEXT: xor a5, a3, a5 12610; RV32IA-WMO-NEXT: and a5, a5, a4 12611; RV32IA-WMO-NEXT: xor a5, a3, a5 12612; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 12613; RV32IA-WMO-NEXT: bnez a5, .LBB88_1 12614; RV32IA-WMO-NEXT: # %bb.2: 12615; RV32IA-WMO-NEXT: srl a0, a3, a0 12616; RV32IA-WMO-NEXT: ret 12617; 12618; RV32IA-TSO-LABEL: atomicrmw_sub_i16_acq_rel: 12619; RV32IA-TSO: # %bb.0: 12620; RV32IA-TSO-NEXT: andi a2, a0, -4 12621; RV32IA-TSO-NEXT: slli a0, a0, 3 12622; RV32IA-TSO-NEXT: lui a3, 16 12623; RV32IA-TSO-NEXT: addi a3, a3, -1 12624; RV32IA-TSO-NEXT: sll a4, a3, a0 12625; RV32IA-TSO-NEXT: and a1, a1, a3 12626; RV32IA-TSO-NEXT: sll a1, a1, a0 12627; RV32IA-TSO-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1 12628; RV32IA-TSO-NEXT: lr.w a3, (a2) 12629; RV32IA-TSO-NEXT: sub a5, a3, a1 12630; RV32IA-TSO-NEXT: xor a5, a3, a5 12631; RV32IA-TSO-NEXT: and a5, a5, a4 12632; RV32IA-TSO-NEXT: xor a5, a3, a5 12633; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 12634; RV32IA-TSO-NEXT: bnez a5, .LBB88_1 12635; RV32IA-TSO-NEXT: # %bb.2: 12636; RV32IA-TSO-NEXT: srl a0, a3, a0 12637; RV32IA-TSO-NEXT: ret 12638; 12639; RV64I-LABEL: atomicrmw_sub_i16_acq_rel: 12640; RV64I: # %bb.0: 12641; RV64I-NEXT: addi sp, sp, -16 12642; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12643; RV64I-NEXT: li a2, 4 12644; RV64I-NEXT: call __atomic_fetch_sub_2 12645; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12646; RV64I-NEXT: addi sp, sp, 16 12647; RV64I-NEXT: ret 12648; 12649; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_acq_rel: 12650; RV64IA-WMO-NOZACAS: # %bb.0: 12651; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 12652; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 12653; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 12654; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 12655; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 12656; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 12657; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 12658; RV64IA-WMO-NOZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1 12659; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 12660; RV64IA-WMO-NOZACAS-NEXT: sub a5, a3, a1 12661; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 12662; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 12663; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 12664; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 12665; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB88_1 12666; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 12667; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 12668; RV64IA-WMO-NOZACAS-NEXT: ret 12669; 12670; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_acq_rel: 12671; RV64IA-TSO-NOZACAS: # %bb.0: 12672; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 12673; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 12674; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 12675; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 12676; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 12677; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 12678; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 12679; RV64IA-TSO-NOZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1 12680; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 12681; RV64IA-TSO-NOZACAS-NEXT: sub a5, a3, a1 12682; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12683; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 12684; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 12685; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 12686; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB88_1 12687; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 12688; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 12689; RV64IA-TSO-NOZACAS-NEXT: ret 12690; 12691; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_acq_rel: 12692; RV64IA-WMO-ZACAS: # %bb.0: 12693; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 12694; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 12695; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 12696; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 12697; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 12698; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 12699; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 12700; RV64IA-WMO-ZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1 12701; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 12702; RV64IA-WMO-ZACAS-NEXT: sub a5, a3, a1 12703; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12704; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 12705; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 12706; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 12707; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB88_1 12708; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 12709; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 12710; RV64IA-WMO-ZACAS-NEXT: ret 12711; 12712; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_acq_rel: 12713; RV64IA-TSO-ZACAS: # %bb.0: 12714; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 12715; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 12716; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 12717; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 12718; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 12719; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 12720; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 12721; RV64IA-TSO-ZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1 12722; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 12723; RV64IA-TSO-ZACAS-NEXT: sub a5, a3, a1 12724; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12725; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 12726; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 12727; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 12728; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB88_1 12729; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 12730; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 12731; RV64IA-TSO-ZACAS-NEXT: ret 12732; 12733; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_acq_rel: 12734; RV64IA-WMO-ZABHA: # %bb.0: 12735; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 12736; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0) 12737; RV64IA-WMO-ZABHA-NEXT: ret 12738; 12739; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_acq_rel: 12740; RV64IA-TSO-ZABHA: # %bb.0: 12741; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 12742; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12743; RV64IA-TSO-ZABHA-NEXT: ret 12744 %1 = atomicrmw sub ptr %a, i16 %b acq_rel 12745 ret i16 %1 12746} 12747 12748define i16 @atomicrmw_sub_i16_seq_cst(ptr %a, i16 %b) nounwind { 12749; RV32I-LABEL: atomicrmw_sub_i16_seq_cst: 12750; RV32I: # %bb.0: 12751; RV32I-NEXT: addi sp, sp, -16 12752; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12753; RV32I-NEXT: li a2, 5 12754; RV32I-NEXT: call __atomic_fetch_sub_2 12755; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12756; RV32I-NEXT: addi sp, sp, 16 12757; RV32I-NEXT: ret 12758; 12759; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst: 12760; RV32IA: # %bb.0: 12761; RV32IA-NEXT: andi a2, a0, -4 12762; RV32IA-NEXT: slli a0, a0, 3 12763; RV32IA-NEXT: lui a3, 16 12764; RV32IA-NEXT: addi a3, a3, -1 12765; RV32IA-NEXT: sll a4, a3, a0 12766; RV32IA-NEXT: and a1, a1, a3 12767; RV32IA-NEXT: sll a1, a1, a0 12768; RV32IA-NEXT: .LBB89_1: # =>This Inner Loop Header: Depth=1 12769; RV32IA-NEXT: lr.w.aqrl a3, (a2) 12770; RV32IA-NEXT: sub a5, a3, a1 12771; RV32IA-NEXT: xor a5, a3, a5 12772; RV32IA-NEXT: and a5, a5, a4 12773; RV32IA-NEXT: xor a5, a3, a5 12774; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 12775; RV32IA-NEXT: bnez a5, .LBB89_1 12776; RV32IA-NEXT: # %bb.2: 12777; RV32IA-NEXT: srl a0, a3, a0 12778; RV32IA-NEXT: ret 12779; 12780; RV64I-LABEL: atomicrmw_sub_i16_seq_cst: 12781; RV64I: # %bb.0: 12782; RV64I-NEXT: addi sp, sp, -16 12783; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12784; RV64I-NEXT: li a2, 5 12785; RV64I-NEXT: call __atomic_fetch_sub_2 12786; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12787; RV64I-NEXT: addi sp, sp, 16 12788; RV64I-NEXT: ret 12789; 12790; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i16_seq_cst: 12791; RV64IA-NOZACAS: # %bb.0: 12792; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 12793; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 12794; RV64IA-NOZACAS-NEXT: lui a3, 16 12795; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 12796; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 12797; RV64IA-NOZACAS-NEXT: and a1, a1, a3 12798; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 12799; RV64IA-NOZACAS-NEXT: .LBB89_1: # =>This Inner Loop Header: Depth=1 12800; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 12801; RV64IA-NOZACAS-NEXT: sub a5, a3, a1 12802; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 12803; RV64IA-NOZACAS-NEXT: and a5, a5, a4 12804; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 12805; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 12806; RV64IA-NOZACAS-NEXT: bnez a5, .LBB89_1 12807; RV64IA-NOZACAS-NEXT: # %bb.2: 12808; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 12809; RV64IA-NOZACAS-NEXT: ret 12810; 12811; RV64IA-ZACAS-LABEL: atomicrmw_sub_i16_seq_cst: 12812; RV64IA-ZACAS: # %bb.0: 12813; RV64IA-ZACAS-NEXT: andi a2, a0, -4 12814; RV64IA-ZACAS-NEXT: slli a0, a0, 3 12815; RV64IA-ZACAS-NEXT: lui a3, 16 12816; RV64IA-ZACAS-NEXT: addi a3, a3, -1 12817; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 12818; RV64IA-ZACAS-NEXT: and a1, a1, a3 12819; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 12820; RV64IA-ZACAS-NEXT: .LBB89_1: # =>This Inner Loop Header: Depth=1 12821; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2) 12822; RV64IA-ZACAS-NEXT: sub a5, a3, a1 12823; RV64IA-ZACAS-NEXT: xor a5, a3, a5 12824; RV64IA-ZACAS-NEXT: and a5, a5, a4 12825; RV64IA-ZACAS-NEXT: xor a5, a3, a5 12826; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 12827; RV64IA-ZACAS-NEXT: bnez a5, .LBB89_1 12828; RV64IA-ZACAS-NEXT: # %bb.2: 12829; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 12830; RV64IA-ZACAS-NEXT: ret 12831; 12832; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_seq_cst: 12833; RV64IA-WMO-ZABHA: # %bb.0: 12834; RV64IA-WMO-ZABHA-NEXT: neg a1, a1 12835; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0) 12836; RV64IA-WMO-ZABHA-NEXT: ret 12837; 12838; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_seq_cst: 12839; RV64IA-TSO-ZABHA: # %bb.0: 12840; RV64IA-TSO-ZABHA-NEXT: neg a1, a1 12841; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0) 12842; RV64IA-TSO-ZABHA-NEXT: ret 12843 %1 = atomicrmw sub ptr %a, i16 %b seq_cst 12844 ret i16 %1 12845} 12846 12847define i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind { 12848; RV32I-LABEL: atomicrmw_and_i16_monotonic: 12849; RV32I: # %bb.0: 12850; RV32I-NEXT: addi sp, sp, -16 12851; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12852; RV32I-NEXT: li a2, 0 12853; RV32I-NEXT: call __atomic_fetch_and_2 12854; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12855; RV32I-NEXT: addi sp, sp, 16 12856; RV32I-NEXT: ret 12857; 12858; RV32IA-LABEL: atomicrmw_and_i16_monotonic: 12859; RV32IA: # %bb.0: 12860; RV32IA-NEXT: andi a2, a0, -4 12861; RV32IA-NEXT: slli a0, a0, 3 12862; RV32IA-NEXT: lui a3, 16 12863; RV32IA-NEXT: addi a3, a3, -1 12864; RV32IA-NEXT: sll a4, a3, a0 12865; RV32IA-NEXT: and a1, a1, a3 12866; RV32IA-NEXT: not a3, a4 12867; RV32IA-NEXT: sll a1, a1, a0 12868; RV32IA-NEXT: or a1, a1, a3 12869; RV32IA-NEXT: amoand.w a1, a1, (a2) 12870; RV32IA-NEXT: srl a0, a1, a0 12871; RV32IA-NEXT: ret 12872; 12873; RV64I-LABEL: atomicrmw_and_i16_monotonic: 12874; RV64I: # %bb.0: 12875; RV64I-NEXT: addi sp, sp, -16 12876; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12877; RV64I-NEXT: li a2, 0 12878; RV64I-NEXT: call __atomic_fetch_and_2 12879; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12880; RV64I-NEXT: addi sp, sp, 16 12881; RV64I-NEXT: ret 12882; 12883; RV64IA-NOZACAS-LABEL: atomicrmw_and_i16_monotonic: 12884; RV64IA-NOZACAS: # %bb.0: 12885; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 12886; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 12887; RV64IA-NOZACAS-NEXT: lui a3, 16 12888; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 12889; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 12890; RV64IA-NOZACAS-NEXT: and a1, a1, a3 12891; RV64IA-NOZACAS-NEXT: not a3, a4 12892; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 12893; RV64IA-NOZACAS-NEXT: or a1, a1, a3 12894; RV64IA-NOZACAS-NEXT: amoand.w a1, a1, (a2) 12895; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 12896; RV64IA-NOZACAS-NEXT: ret 12897; 12898; RV64IA-ZACAS-LABEL: atomicrmw_and_i16_monotonic: 12899; RV64IA-ZACAS: # %bb.0: 12900; RV64IA-ZACAS-NEXT: andi a2, a0, -4 12901; RV64IA-ZACAS-NEXT: slli a0, a0, 3 12902; RV64IA-ZACAS-NEXT: lui a3, 16 12903; RV64IA-ZACAS-NEXT: addi a3, a3, -1 12904; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 12905; RV64IA-ZACAS-NEXT: and a1, a1, a3 12906; RV64IA-ZACAS-NEXT: not a3, a4 12907; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 12908; RV64IA-ZACAS-NEXT: or a1, a1, a3 12909; RV64IA-ZACAS-NEXT: amoand.w a1, a1, (a2) 12910; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 12911; RV64IA-ZACAS-NEXT: ret 12912; 12913; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_monotonic: 12914; RV64IA-WMO-ZABHA: # %bb.0: 12915; RV64IA-WMO-ZABHA-NEXT: amoand.h a0, a1, (a0) 12916; RV64IA-WMO-ZABHA-NEXT: ret 12917; 12918; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_monotonic: 12919; RV64IA-TSO-ZABHA: # %bb.0: 12920; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0) 12921; RV64IA-TSO-ZABHA-NEXT: ret 12922 %1 = atomicrmw and ptr %a, i16 %b monotonic 12923 ret i16 %1 12924} 12925 12926define i16 @atomicrmw_and_i16_acquire(ptr %a, i16 %b) nounwind { 12927; RV32I-LABEL: atomicrmw_and_i16_acquire: 12928; RV32I: # %bb.0: 12929; RV32I-NEXT: addi sp, sp, -16 12930; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 12931; RV32I-NEXT: li a2, 2 12932; RV32I-NEXT: call __atomic_fetch_and_2 12933; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12934; RV32I-NEXT: addi sp, sp, 16 12935; RV32I-NEXT: ret 12936; 12937; RV32IA-WMO-LABEL: atomicrmw_and_i16_acquire: 12938; RV32IA-WMO: # %bb.0: 12939; RV32IA-WMO-NEXT: andi a2, a0, -4 12940; RV32IA-WMO-NEXT: slli a0, a0, 3 12941; RV32IA-WMO-NEXT: lui a3, 16 12942; RV32IA-WMO-NEXT: addi a3, a3, -1 12943; RV32IA-WMO-NEXT: sll a4, a3, a0 12944; RV32IA-WMO-NEXT: and a1, a1, a3 12945; RV32IA-WMO-NEXT: not a3, a4 12946; RV32IA-WMO-NEXT: sll a1, a1, a0 12947; RV32IA-WMO-NEXT: or a1, a1, a3 12948; RV32IA-WMO-NEXT: amoand.w.aq a1, a1, (a2) 12949; RV32IA-WMO-NEXT: srl a0, a1, a0 12950; RV32IA-WMO-NEXT: ret 12951; 12952; RV32IA-TSO-LABEL: atomicrmw_and_i16_acquire: 12953; RV32IA-TSO: # %bb.0: 12954; RV32IA-TSO-NEXT: andi a2, a0, -4 12955; RV32IA-TSO-NEXT: slli a0, a0, 3 12956; RV32IA-TSO-NEXT: lui a3, 16 12957; RV32IA-TSO-NEXT: addi a3, a3, -1 12958; RV32IA-TSO-NEXT: sll a4, a3, a0 12959; RV32IA-TSO-NEXT: and a1, a1, a3 12960; RV32IA-TSO-NEXT: not a3, a4 12961; RV32IA-TSO-NEXT: sll a1, a1, a0 12962; RV32IA-TSO-NEXT: or a1, a1, a3 12963; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 12964; RV32IA-TSO-NEXT: srl a0, a1, a0 12965; RV32IA-TSO-NEXT: ret 12966; 12967; RV64I-LABEL: atomicrmw_and_i16_acquire: 12968; RV64I: # %bb.0: 12969; RV64I-NEXT: addi sp, sp, -16 12970; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 12971; RV64I-NEXT: li a2, 2 12972; RV64I-NEXT: call __atomic_fetch_and_2 12973; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12974; RV64I-NEXT: addi sp, sp, 16 12975; RV64I-NEXT: ret 12976; 12977; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_acquire: 12978; RV64IA-WMO-NOZACAS: # %bb.0: 12979; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 12980; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 12981; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 12982; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 12983; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 12984; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 12985; RV64IA-WMO-NOZACAS-NEXT: not a3, a4 12986; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 12987; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 12988; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a1, (a2) 12989; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 12990; RV64IA-WMO-NOZACAS-NEXT: ret 12991; 12992; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_acquire: 12993; RV64IA-TSO-NOZACAS: # %bb.0: 12994; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 12995; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 12996; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 12997; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 12998; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 12999; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 13000; RV64IA-TSO-NOZACAS-NEXT: not a3, a4 13001; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 13002; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 13003; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 13004; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 13005; RV64IA-TSO-NOZACAS-NEXT: ret 13006; 13007; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_acquire: 13008; RV64IA-WMO-ZACAS: # %bb.0: 13009; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 13010; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 13011; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 13012; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 13013; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 13014; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 13015; RV64IA-WMO-ZACAS-NEXT: not a3, a4 13016; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 13017; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 13018; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a1, (a2) 13019; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 13020; RV64IA-WMO-ZACAS-NEXT: ret 13021; 13022; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_acquire: 13023; RV64IA-TSO-ZACAS: # %bb.0: 13024; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 13025; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 13026; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 13027; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 13028; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 13029; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 13030; RV64IA-TSO-ZACAS-NEXT: not a3, a4 13031; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 13032; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 13033; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 13034; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 13035; RV64IA-TSO-ZACAS-NEXT: ret 13036; 13037; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_acquire: 13038; RV64IA-WMO-ZABHA: # %bb.0: 13039; RV64IA-WMO-ZABHA-NEXT: amoand.h.aq a0, a1, (a0) 13040; RV64IA-WMO-ZABHA-NEXT: ret 13041; 13042; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_acquire: 13043; RV64IA-TSO-ZABHA: # %bb.0: 13044; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0) 13045; RV64IA-TSO-ZABHA-NEXT: ret 13046 %1 = atomicrmw and ptr %a, i16 %b acquire 13047 ret i16 %1 13048} 13049 13050define i16 @atomicrmw_and_i16_release(ptr %a, i16 %b) nounwind { 13051; RV32I-LABEL: atomicrmw_and_i16_release: 13052; RV32I: # %bb.0: 13053; RV32I-NEXT: addi sp, sp, -16 13054; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13055; RV32I-NEXT: li a2, 3 13056; RV32I-NEXT: call __atomic_fetch_and_2 13057; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13058; RV32I-NEXT: addi sp, sp, 16 13059; RV32I-NEXT: ret 13060; 13061; RV32IA-WMO-LABEL: atomicrmw_and_i16_release: 13062; RV32IA-WMO: # %bb.0: 13063; RV32IA-WMO-NEXT: andi a2, a0, -4 13064; RV32IA-WMO-NEXT: slli a0, a0, 3 13065; RV32IA-WMO-NEXT: lui a3, 16 13066; RV32IA-WMO-NEXT: addi a3, a3, -1 13067; RV32IA-WMO-NEXT: sll a4, a3, a0 13068; RV32IA-WMO-NEXT: and a1, a1, a3 13069; RV32IA-WMO-NEXT: not a3, a4 13070; RV32IA-WMO-NEXT: sll a1, a1, a0 13071; RV32IA-WMO-NEXT: or a1, a1, a3 13072; RV32IA-WMO-NEXT: amoand.w.rl a1, a1, (a2) 13073; RV32IA-WMO-NEXT: srl a0, a1, a0 13074; RV32IA-WMO-NEXT: ret 13075; 13076; RV32IA-TSO-LABEL: atomicrmw_and_i16_release: 13077; RV32IA-TSO: # %bb.0: 13078; RV32IA-TSO-NEXT: andi a2, a0, -4 13079; RV32IA-TSO-NEXT: slli a0, a0, 3 13080; RV32IA-TSO-NEXT: lui a3, 16 13081; RV32IA-TSO-NEXT: addi a3, a3, -1 13082; RV32IA-TSO-NEXT: sll a4, a3, a0 13083; RV32IA-TSO-NEXT: and a1, a1, a3 13084; RV32IA-TSO-NEXT: not a3, a4 13085; RV32IA-TSO-NEXT: sll a1, a1, a0 13086; RV32IA-TSO-NEXT: or a1, a1, a3 13087; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 13088; RV32IA-TSO-NEXT: srl a0, a1, a0 13089; RV32IA-TSO-NEXT: ret 13090; 13091; RV64I-LABEL: atomicrmw_and_i16_release: 13092; RV64I: # %bb.0: 13093; RV64I-NEXT: addi sp, sp, -16 13094; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13095; RV64I-NEXT: li a2, 3 13096; RV64I-NEXT: call __atomic_fetch_and_2 13097; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13098; RV64I-NEXT: addi sp, sp, 16 13099; RV64I-NEXT: ret 13100; 13101; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_release: 13102; RV64IA-WMO-NOZACAS: # %bb.0: 13103; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 13104; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 13105; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 13106; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 13107; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 13108; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 13109; RV64IA-WMO-NOZACAS-NEXT: not a3, a4 13110; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 13111; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 13112; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a1, (a2) 13113; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 13114; RV64IA-WMO-NOZACAS-NEXT: ret 13115; 13116; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_release: 13117; RV64IA-TSO-NOZACAS: # %bb.0: 13118; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 13119; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 13120; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 13121; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 13122; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 13123; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 13124; RV64IA-TSO-NOZACAS-NEXT: not a3, a4 13125; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 13126; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 13127; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 13128; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 13129; RV64IA-TSO-NOZACAS-NEXT: ret 13130; 13131; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_release: 13132; RV64IA-WMO-ZACAS: # %bb.0: 13133; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 13134; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 13135; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 13136; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 13137; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 13138; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 13139; RV64IA-WMO-ZACAS-NEXT: not a3, a4 13140; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 13141; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 13142; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a1, (a2) 13143; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 13144; RV64IA-WMO-ZACAS-NEXT: ret 13145; 13146; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_release: 13147; RV64IA-TSO-ZACAS: # %bb.0: 13148; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 13149; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 13150; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 13151; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 13152; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 13153; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 13154; RV64IA-TSO-ZACAS-NEXT: not a3, a4 13155; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 13156; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 13157; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 13158; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 13159; RV64IA-TSO-ZACAS-NEXT: ret 13160; 13161; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_release: 13162; RV64IA-WMO-ZABHA: # %bb.0: 13163; RV64IA-WMO-ZABHA-NEXT: amoand.h.rl a0, a1, (a0) 13164; RV64IA-WMO-ZABHA-NEXT: ret 13165; 13166; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_release: 13167; RV64IA-TSO-ZABHA: # %bb.0: 13168; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0) 13169; RV64IA-TSO-ZABHA-NEXT: ret 13170 %1 = atomicrmw and ptr %a, i16 %b release 13171 ret i16 %1 13172} 13173 13174define i16 @atomicrmw_and_i16_acq_rel(ptr %a, i16 %b) nounwind { 13175; RV32I-LABEL: atomicrmw_and_i16_acq_rel: 13176; RV32I: # %bb.0: 13177; RV32I-NEXT: addi sp, sp, -16 13178; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13179; RV32I-NEXT: li a2, 4 13180; RV32I-NEXT: call __atomic_fetch_and_2 13181; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13182; RV32I-NEXT: addi sp, sp, 16 13183; RV32I-NEXT: ret 13184; 13185; RV32IA-WMO-LABEL: atomicrmw_and_i16_acq_rel: 13186; RV32IA-WMO: # %bb.0: 13187; RV32IA-WMO-NEXT: andi a2, a0, -4 13188; RV32IA-WMO-NEXT: slli a0, a0, 3 13189; RV32IA-WMO-NEXT: lui a3, 16 13190; RV32IA-WMO-NEXT: addi a3, a3, -1 13191; RV32IA-WMO-NEXT: sll a4, a3, a0 13192; RV32IA-WMO-NEXT: and a1, a1, a3 13193; RV32IA-WMO-NEXT: not a3, a4 13194; RV32IA-WMO-NEXT: sll a1, a1, a0 13195; RV32IA-WMO-NEXT: or a1, a1, a3 13196; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2) 13197; RV32IA-WMO-NEXT: srl a0, a1, a0 13198; RV32IA-WMO-NEXT: ret 13199; 13200; RV32IA-TSO-LABEL: atomicrmw_and_i16_acq_rel: 13201; RV32IA-TSO: # %bb.0: 13202; RV32IA-TSO-NEXT: andi a2, a0, -4 13203; RV32IA-TSO-NEXT: slli a0, a0, 3 13204; RV32IA-TSO-NEXT: lui a3, 16 13205; RV32IA-TSO-NEXT: addi a3, a3, -1 13206; RV32IA-TSO-NEXT: sll a4, a3, a0 13207; RV32IA-TSO-NEXT: and a1, a1, a3 13208; RV32IA-TSO-NEXT: not a3, a4 13209; RV32IA-TSO-NEXT: sll a1, a1, a0 13210; RV32IA-TSO-NEXT: or a1, a1, a3 13211; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 13212; RV32IA-TSO-NEXT: srl a0, a1, a0 13213; RV32IA-TSO-NEXT: ret 13214; 13215; RV64I-LABEL: atomicrmw_and_i16_acq_rel: 13216; RV64I: # %bb.0: 13217; RV64I-NEXT: addi sp, sp, -16 13218; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13219; RV64I-NEXT: li a2, 4 13220; RV64I-NEXT: call __atomic_fetch_and_2 13221; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13222; RV64I-NEXT: addi sp, sp, 16 13223; RV64I-NEXT: ret 13224; 13225; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_acq_rel: 13226; RV64IA-WMO-NOZACAS: # %bb.0: 13227; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 13228; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 13229; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 13230; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 13231; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 13232; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 13233; RV64IA-WMO-NOZACAS-NEXT: not a3, a4 13234; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 13235; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 13236; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 13237; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 13238; RV64IA-WMO-NOZACAS-NEXT: ret 13239; 13240; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_acq_rel: 13241; RV64IA-TSO-NOZACAS: # %bb.0: 13242; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 13243; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 13244; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 13245; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 13246; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 13247; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 13248; RV64IA-TSO-NOZACAS-NEXT: not a3, a4 13249; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 13250; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 13251; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 13252; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 13253; RV64IA-TSO-NOZACAS-NEXT: ret 13254; 13255; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_acq_rel: 13256; RV64IA-WMO-ZACAS: # %bb.0: 13257; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 13258; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 13259; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 13260; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 13261; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 13262; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 13263; RV64IA-WMO-ZACAS-NEXT: not a3, a4 13264; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 13265; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 13266; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 13267; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 13268; RV64IA-WMO-ZACAS-NEXT: ret 13269; 13270; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_acq_rel: 13271; RV64IA-TSO-ZACAS: # %bb.0: 13272; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 13273; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 13274; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 13275; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 13276; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 13277; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 13278; RV64IA-TSO-ZACAS-NEXT: not a3, a4 13279; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 13280; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 13281; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 13282; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 13283; RV64IA-TSO-ZACAS-NEXT: ret 13284; 13285; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_acq_rel: 13286; RV64IA-WMO-ZABHA: # %bb.0: 13287; RV64IA-WMO-ZABHA-NEXT: amoand.h.aqrl a0, a1, (a0) 13288; RV64IA-WMO-ZABHA-NEXT: ret 13289; 13290; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_acq_rel: 13291; RV64IA-TSO-ZABHA: # %bb.0: 13292; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0) 13293; RV64IA-TSO-ZABHA-NEXT: ret 13294 %1 = atomicrmw and ptr %a, i16 %b acq_rel 13295 ret i16 %1 13296} 13297 13298define i16 @atomicrmw_and_i16_seq_cst(ptr %a, i16 %b) nounwind { 13299; RV32I-LABEL: atomicrmw_and_i16_seq_cst: 13300; RV32I: # %bb.0: 13301; RV32I-NEXT: addi sp, sp, -16 13302; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13303; RV32I-NEXT: li a2, 5 13304; RV32I-NEXT: call __atomic_fetch_and_2 13305; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13306; RV32I-NEXT: addi sp, sp, 16 13307; RV32I-NEXT: ret 13308; 13309; RV32IA-WMO-LABEL: atomicrmw_and_i16_seq_cst: 13310; RV32IA-WMO: # %bb.0: 13311; RV32IA-WMO-NEXT: andi a2, a0, -4 13312; RV32IA-WMO-NEXT: slli a0, a0, 3 13313; RV32IA-WMO-NEXT: lui a3, 16 13314; RV32IA-WMO-NEXT: addi a3, a3, -1 13315; RV32IA-WMO-NEXT: sll a4, a3, a0 13316; RV32IA-WMO-NEXT: and a1, a1, a3 13317; RV32IA-WMO-NEXT: not a3, a4 13318; RV32IA-WMO-NEXT: sll a1, a1, a0 13319; RV32IA-WMO-NEXT: or a1, a1, a3 13320; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2) 13321; RV32IA-WMO-NEXT: srl a0, a1, a0 13322; RV32IA-WMO-NEXT: ret 13323; 13324; RV32IA-TSO-LABEL: atomicrmw_and_i16_seq_cst: 13325; RV32IA-TSO: # %bb.0: 13326; RV32IA-TSO-NEXT: andi a2, a0, -4 13327; RV32IA-TSO-NEXT: slli a0, a0, 3 13328; RV32IA-TSO-NEXT: lui a3, 16 13329; RV32IA-TSO-NEXT: addi a3, a3, -1 13330; RV32IA-TSO-NEXT: sll a4, a3, a0 13331; RV32IA-TSO-NEXT: and a1, a1, a3 13332; RV32IA-TSO-NEXT: not a3, a4 13333; RV32IA-TSO-NEXT: sll a1, a1, a0 13334; RV32IA-TSO-NEXT: or a1, a1, a3 13335; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2) 13336; RV32IA-TSO-NEXT: srl a0, a1, a0 13337; RV32IA-TSO-NEXT: ret 13338; 13339; RV64I-LABEL: atomicrmw_and_i16_seq_cst: 13340; RV64I: # %bb.0: 13341; RV64I-NEXT: addi sp, sp, -16 13342; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13343; RV64I-NEXT: li a2, 5 13344; RV64I-NEXT: call __atomic_fetch_and_2 13345; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13346; RV64I-NEXT: addi sp, sp, 16 13347; RV64I-NEXT: ret 13348; 13349; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_seq_cst: 13350; RV64IA-WMO-NOZACAS: # %bb.0: 13351; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 13352; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 13353; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 13354; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 13355; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 13356; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 13357; RV64IA-WMO-NOZACAS-NEXT: not a3, a4 13358; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 13359; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3 13360; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 13361; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 13362; RV64IA-WMO-NOZACAS-NEXT: ret 13363; 13364; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_seq_cst: 13365; RV64IA-TSO-NOZACAS: # %bb.0: 13366; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 13367; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 13368; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 13369; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 13370; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 13371; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 13372; RV64IA-TSO-NOZACAS-NEXT: not a3, a4 13373; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 13374; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3 13375; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2) 13376; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 13377; RV64IA-TSO-NOZACAS-NEXT: ret 13378; 13379; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_seq_cst: 13380; RV64IA-WMO-ZACAS: # %bb.0: 13381; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 13382; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 13383; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 13384; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 13385; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 13386; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 13387; RV64IA-WMO-ZACAS-NEXT: not a3, a4 13388; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 13389; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3 13390; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2) 13391; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 13392; RV64IA-WMO-ZACAS-NEXT: ret 13393; 13394; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_seq_cst: 13395; RV64IA-TSO-ZACAS: # %bb.0: 13396; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 13397; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 13398; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 13399; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 13400; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 13401; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 13402; RV64IA-TSO-ZACAS-NEXT: not a3, a4 13403; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 13404; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3 13405; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2) 13406; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 13407; RV64IA-TSO-ZACAS-NEXT: ret 13408; 13409; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_seq_cst: 13410; RV64IA-WMO-ZABHA: # %bb.0: 13411; RV64IA-WMO-ZABHA-NEXT: amoand.h.aqrl a0, a1, (a0) 13412; RV64IA-WMO-ZABHA-NEXT: ret 13413; 13414; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_seq_cst: 13415; RV64IA-TSO-ZABHA: # %bb.0: 13416; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0) 13417; RV64IA-TSO-ZABHA-NEXT: ret 13418 %1 = atomicrmw and ptr %a, i16 %b seq_cst 13419 ret i16 %1 13420} 13421 13422define i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind { 13423; RV32I-LABEL: atomicrmw_nand_i16_monotonic: 13424; RV32I: # %bb.0: 13425; RV32I-NEXT: addi sp, sp, -16 13426; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13427; RV32I-NEXT: li a2, 0 13428; RV32I-NEXT: call __atomic_fetch_nand_2 13429; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13430; RV32I-NEXT: addi sp, sp, 16 13431; RV32I-NEXT: ret 13432; 13433; RV32IA-LABEL: atomicrmw_nand_i16_monotonic: 13434; RV32IA: # %bb.0: 13435; RV32IA-NEXT: andi a2, a0, -4 13436; RV32IA-NEXT: slli a0, a0, 3 13437; RV32IA-NEXT: lui a3, 16 13438; RV32IA-NEXT: addi a3, a3, -1 13439; RV32IA-NEXT: sll a4, a3, a0 13440; RV32IA-NEXT: and a1, a1, a3 13441; RV32IA-NEXT: sll a1, a1, a0 13442; RV32IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 13443; RV32IA-NEXT: lr.w a3, (a2) 13444; RV32IA-NEXT: and a5, a3, a1 13445; RV32IA-NEXT: not a5, a5 13446; RV32IA-NEXT: xor a5, a3, a5 13447; RV32IA-NEXT: and a5, a5, a4 13448; RV32IA-NEXT: xor a5, a3, a5 13449; RV32IA-NEXT: sc.w a5, a5, (a2) 13450; RV32IA-NEXT: bnez a5, .LBB95_1 13451; RV32IA-NEXT: # %bb.2: 13452; RV32IA-NEXT: srl a0, a3, a0 13453; RV32IA-NEXT: ret 13454; 13455; RV64I-LABEL: atomicrmw_nand_i16_monotonic: 13456; RV64I: # %bb.0: 13457; RV64I-NEXT: addi sp, sp, -16 13458; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13459; RV64I-NEXT: li a2, 0 13460; RV64I-NEXT: call __atomic_fetch_nand_2 13461; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13462; RV64I-NEXT: addi sp, sp, 16 13463; RV64I-NEXT: ret 13464; 13465; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic: 13466; RV64IA-NOZACAS: # %bb.0: 13467; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 13468; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 13469; RV64IA-NOZACAS-NEXT: lui a3, 16 13470; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 13471; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 13472; RV64IA-NOZACAS-NEXT: and a1, a1, a3 13473; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 13474; RV64IA-NOZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 13475; RV64IA-NOZACAS-NEXT: lr.w a3, (a2) 13476; RV64IA-NOZACAS-NEXT: and a5, a3, a1 13477; RV64IA-NOZACAS-NEXT: not a5, a5 13478; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 13479; RV64IA-NOZACAS-NEXT: and a5, a5, a4 13480; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 13481; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 13482; RV64IA-NOZACAS-NEXT: bnez a5, .LBB95_1 13483; RV64IA-NOZACAS-NEXT: # %bb.2: 13484; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 13485; RV64IA-NOZACAS-NEXT: ret 13486; 13487; RV64IA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic: 13488; RV64IA-ZACAS: # %bb.0: 13489; RV64IA-ZACAS-NEXT: andi a2, a0, -4 13490; RV64IA-ZACAS-NEXT: slli a0, a0, 3 13491; RV64IA-ZACAS-NEXT: lui a3, 16 13492; RV64IA-ZACAS-NEXT: addi a3, a3, -1 13493; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 13494; RV64IA-ZACAS-NEXT: and a1, a1, a3 13495; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 13496; RV64IA-ZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 13497; RV64IA-ZACAS-NEXT: lr.w a3, (a2) 13498; RV64IA-ZACAS-NEXT: and a5, a3, a1 13499; RV64IA-ZACAS-NEXT: not a5, a5 13500; RV64IA-ZACAS-NEXT: xor a5, a3, a5 13501; RV64IA-ZACAS-NEXT: and a5, a5, a4 13502; RV64IA-ZACAS-NEXT: xor a5, a3, a5 13503; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 13504; RV64IA-ZACAS-NEXT: bnez a5, .LBB95_1 13505; RV64IA-ZACAS-NEXT: # %bb.2: 13506; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 13507; RV64IA-ZACAS-NEXT: ret 13508; 13509; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic: 13510; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 13511; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 13512; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 13513; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16 13514; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 13515; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 13516; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 13517; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 13518; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 13519; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2) 13520; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 13521; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 13522; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13523; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 13524; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13525; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 13526; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB95_1 13527; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 13528; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 13529; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 13530; 13531; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic: 13532; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 13533; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 13534; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 13535; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16 13536; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 13537; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 13538; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 13539; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 13540; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1 13541; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2) 13542; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 13543; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 13544; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13545; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 13546; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13547; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 13548; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB95_1 13549; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 13550; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 13551; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 13552; 13553; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic: 13554; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 13555; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 13556; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 13557; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB95_1: # %atomicrmw.start 13558; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 13559; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 13560; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 13561; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 13562; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2) 13563; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 13564; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB95_1 13565; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 13566; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 13567; 13568; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic: 13569; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 13570; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 13571; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 13572; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB95_1: # %atomicrmw.start 13573; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 13574; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 13575; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 13576; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 13577; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2) 13578; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 13579; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB95_1 13580; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 13581; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 13582 %1 = atomicrmw nand ptr %a, i16 %b monotonic 13583 ret i16 %1 13584} 13585 13586define i16 @atomicrmw_nand_i16_acquire(ptr %a, i16 %b) nounwind { 13587; RV32I-LABEL: atomicrmw_nand_i16_acquire: 13588; RV32I: # %bb.0: 13589; RV32I-NEXT: addi sp, sp, -16 13590; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13591; RV32I-NEXT: li a2, 2 13592; RV32I-NEXT: call __atomic_fetch_nand_2 13593; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13594; RV32I-NEXT: addi sp, sp, 16 13595; RV32I-NEXT: ret 13596; 13597; RV32IA-WMO-LABEL: atomicrmw_nand_i16_acquire: 13598; RV32IA-WMO: # %bb.0: 13599; RV32IA-WMO-NEXT: andi a2, a0, -4 13600; RV32IA-WMO-NEXT: slli a0, a0, 3 13601; RV32IA-WMO-NEXT: lui a3, 16 13602; RV32IA-WMO-NEXT: addi a3, a3, -1 13603; RV32IA-WMO-NEXT: sll a4, a3, a0 13604; RV32IA-WMO-NEXT: and a1, a1, a3 13605; RV32IA-WMO-NEXT: sll a1, a1, a0 13606; RV32IA-WMO-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13607; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 13608; RV32IA-WMO-NEXT: and a5, a3, a1 13609; RV32IA-WMO-NEXT: not a5, a5 13610; RV32IA-WMO-NEXT: xor a5, a3, a5 13611; RV32IA-WMO-NEXT: and a5, a5, a4 13612; RV32IA-WMO-NEXT: xor a5, a3, a5 13613; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 13614; RV32IA-WMO-NEXT: bnez a5, .LBB96_1 13615; RV32IA-WMO-NEXT: # %bb.2: 13616; RV32IA-WMO-NEXT: srl a0, a3, a0 13617; RV32IA-WMO-NEXT: ret 13618; 13619; RV32IA-TSO-LABEL: atomicrmw_nand_i16_acquire: 13620; RV32IA-TSO: # %bb.0: 13621; RV32IA-TSO-NEXT: andi a2, a0, -4 13622; RV32IA-TSO-NEXT: slli a0, a0, 3 13623; RV32IA-TSO-NEXT: lui a3, 16 13624; RV32IA-TSO-NEXT: addi a3, a3, -1 13625; RV32IA-TSO-NEXT: sll a4, a3, a0 13626; RV32IA-TSO-NEXT: and a1, a1, a3 13627; RV32IA-TSO-NEXT: sll a1, a1, a0 13628; RV32IA-TSO-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13629; RV32IA-TSO-NEXT: lr.w a3, (a2) 13630; RV32IA-TSO-NEXT: and a5, a3, a1 13631; RV32IA-TSO-NEXT: not a5, a5 13632; RV32IA-TSO-NEXT: xor a5, a3, a5 13633; RV32IA-TSO-NEXT: and a5, a5, a4 13634; RV32IA-TSO-NEXT: xor a5, a3, a5 13635; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 13636; RV32IA-TSO-NEXT: bnez a5, .LBB96_1 13637; RV32IA-TSO-NEXT: # %bb.2: 13638; RV32IA-TSO-NEXT: srl a0, a3, a0 13639; RV32IA-TSO-NEXT: ret 13640; 13641; RV64I-LABEL: atomicrmw_nand_i16_acquire: 13642; RV64I: # %bb.0: 13643; RV64I-NEXT: addi sp, sp, -16 13644; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13645; RV64I-NEXT: li a2, 2 13646; RV64I-NEXT: call __atomic_fetch_nand_2 13647; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13648; RV64I-NEXT: addi sp, sp, 16 13649; RV64I-NEXT: ret 13650; 13651; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_acquire: 13652; RV64IA-WMO-NOZACAS: # %bb.0: 13653; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 13654; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 13655; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 13656; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 13657; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 13658; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 13659; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 13660; RV64IA-WMO-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13661; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 13662; RV64IA-WMO-NOZACAS-NEXT: and a5, a3, a1 13663; RV64IA-WMO-NOZACAS-NEXT: not a5, a5 13664; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 13665; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 13666; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 13667; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 13668; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB96_1 13669; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 13670; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 13671; RV64IA-WMO-NOZACAS-NEXT: ret 13672; 13673; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_acquire: 13674; RV64IA-TSO-NOZACAS: # %bb.0: 13675; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 13676; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 13677; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 13678; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 13679; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 13680; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 13681; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 13682; RV64IA-TSO-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13683; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 13684; RV64IA-TSO-NOZACAS-NEXT: and a5, a3, a1 13685; RV64IA-TSO-NOZACAS-NEXT: not a5, a5 13686; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 13687; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 13688; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 13689; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 13690; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB96_1 13691; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 13692; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 13693; RV64IA-TSO-NOZACAS-NEXT: ret 13694; 13695; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_acquire: 13696; RV64IA-WMO-ZACAS: # %bb.0: 13697; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 13698; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 13699; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 13700; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 13701; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 13702; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 13703; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 13704; RV64IA-WMO-ZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13705; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 13706; RV64IA-WMO-ZACAS-NEXT: and a5, a3, a1 13707; RV64IA-WMO-ZACAS-NEXT: not a5, a5 13708; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 13709; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 13710; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 13711; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 13712; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB96_1 13713; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 13714; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 13715; RV64IA-WMO-ZACAS-NEXT: ret 13716; 13717; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_acquire: 13718; RV64IA-TSO-ZACAS: # %bb.0: 13719; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 13720; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 13721; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 13722; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 13723; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 13724; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 13725; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 13726; RV64IA-TSO-ZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13727; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 13728; RV64IA-TSO-ZACAS-NEXT: and a5, a3, a1 13729; RV64IA-TSO-ZACAS-NEXT: not a5, a5 13730; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 13731; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 13732; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 13733; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 13734; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB96_1 13735; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 13736; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 13737; RV64IA-TSO-ZACAS-NEXT: ret 13738; 13739; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acquire: 13740; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 13741; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 13742; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 13743; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16 13744; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 13745; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 13746; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 13747; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 13748; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13749; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a3, (a2) 13750; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 13751; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 13752; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13753; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 13754; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13755; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 13756; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB96_1 13757; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 13758; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 13759; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 13760; 13761; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acquire: 13762; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 13763; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 13764; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 13765; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16 13766; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 13767; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 13768; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 13769; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 13770; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1 13771; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2) 13772; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 13773; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 13774; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13775; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 13776; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13777; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 13778; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB96_1 13779; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 13780; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 13781; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 13782; 13783; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acquire: 13784; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 13785; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 13786; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 13787; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB96_1: # %atomicrmw.start 13788; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 13789; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 13790; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 13791; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 13792; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aq a0, a3, (a2) 13793; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 13794; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB96_1 13795; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 13796; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 13797; 13798; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acquire: 13799; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 13800; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 13801; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 13802; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB96_1: # %atomicrmw.start 13803; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 13804; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 13805; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 13806; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 13807; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2) 13808; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 13809; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB96_1 13810; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 13811; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 13812 %1 = atomicrmw nand ptr %a, i16 %b acquire 13813 ret i16 %1 13814} 13815 13816define i16 @atomicrmw_nand_i16_release(ptr %a, i16 %b) nounwind { 13817; RV32I-LABEL: atomicrmw_nand_i16_release: 13818; RV32I: # %bb.0: 13819; RV32I-NEXT: addi sp, sp, -16 13820; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 13821; RV32I-NEXT: li a2, 3 13822; RV32I-NEXT: call __atomic_fetch_nand_2 13823; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 13824; RV32I-NEXT: addi sp, sp, 16 13825; RV32I-NEXT: ret 13826; 13827; RV32IA-WMO-LABEL: atomicrmw_nand_i16_release: 13828; RV32IA-WMO: # %bb.0: 13829; RV32IA-WMO-NEXT: andi a2, a0, -4 13830; RV32IA-WMO-NEXT: slli a0, a0, 3 13831; RV32IA-WMO-NEXT: lui a3, 16 13832; RV32IA-WMO-NEXT: addi a3, a3, -1 13833; RV32IA-WMO-NEXT: sll a4, a3, a0 13834; RV32IA-WMO-NEXT: and a1, a1, a3 13835; RV32IA-WMO-NEXT: sll a1, a1, a0 13836; RV32IA-WMO-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13837; RV32IA-WMO-NEXT: lr.w a3, (a2) 13838; RV32IA-WMO-NEXT: and a5, a3, a1 13839; RV32IA-WMO-NEXT: not a5, a5 13840; RV32IA-WMO-NEXT: xor a5, a3, a5 13841; RV32IA-WMO-NEXT: and a5, a5, a4 13842; RV32IA-WMO-NEXT: xor a5, a3, a5 13843; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 13844; RV32IA-WMO-NEXT: bnez a5, .LBB97_1 13845; RV32IA-WMO-NEXT: # %bb.2: 13846; RV32IA-WMO-NEXT: srl a0, a3, a0 13847; RV32IA-WMO-NEXT: ret 13848; 13849; RV32IA-TSO-LABEL: atomicrmw_nand_i16_release: 13850; RV32IA-TSO: # %bb.0: 13851; RV32IA-TSO-NEXT: andi a2, a0, -4 13852; RV32IA-TSO-NEXT: slli a0, a0, 3 13853; RV32IA-TSO-NEXT: lui a3, 16 13854; RV32IA-TSO-NEXT: addi a3, a3, -1 13855; RV32IA-TSO-NEXT: sll a4, a3, a0 13856; RV32IA-TSO-NEXT: and a1, a1, a3 13857; RV32IA-TSO-NEXT: sll a1, a1, a0 13858; RV32IA-TSO-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13859; RV32IA-TSO-NEXT: lr.w a3, (a2) 13860; RV32IA-TSO-NEXT: and a5, a3, a1 13861; RV32IA-TSO-NEXT: not a5, a5 13862; RV32IA-TSO-NEXT: xor a5, a3, a5 13863; RV32IA-TSO-NEXT: and a5, a5, a4 13864; RV32IA-TSO-NEXT: xor a5, a3, a5 13865; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 13866; RV32IA-TSO-NEXT: bnez a5, .LBB97_1 13867; RV32IA-TSO-NEXT: # %bb.2: 13868; RV32IA-TSO-NEXT: srl a0, a3, a0 13869; RV32IA-TSO-NEXT: ret 13870; 13871; RV64I-LABEL: atomicrmw_nand_i16_release: 13872; RV64I: # %bb.0: 13873; RV64I-NEXT: addi sp, sp, -16 13874; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 13875; RV64I-NEXT: li a2, 3 13876; RV64I-NEXT: call __atomic_fetch_nand_2 13877; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 13878; RV64I-NEXT: addi sp, sp, 16 13879; RV64I-NEXT: ret 13880; 13881; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_release: 13882; RV64IA-WMO-NOZACAS: # %bb.0: 13883; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 13884; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 13885; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 13886; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 13887; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 13888; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 13889; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 13890; RV64IA-WMO-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13891; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2) 13892; RV64IA-WMO-NOZACAS-NEXT: and a5, a3, a1 13893; RV64IA-WMO-NOZACAS-NEXT: not a5, a5 13894; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 13895; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 13896; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 13897; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 13898; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB97_1 13899; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 13900; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 13901; RV64IA-WMO-NOZACAS-NEXT: ret 13902; 13903; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_release: 13904; RV64IA-TSO-NOZACAS: # %bb.0: 13905; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 13906; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 13907; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 13908; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 13909; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 13910; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 13911; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 13912; RV64IA-TSO-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13913; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 13914; RV64IA-TSO-NOZACAS-NEXT: and a5, a3, a1 13915; RV64IA-TSO-NOZACAS-NEXT: not a5, a5 13916; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 13917; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 13918; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 13919; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 13920; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB97_1 13921; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 13922; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 13923; RV64IA-TSO-NOZACAS-NEXT: ret 13924; 13925; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_release: 13926; RV64IA-WMO-ZACAS: # %bb.0: 13927; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 13928; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 13929; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 13930; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 13931; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 13932; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 13933; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 13934; RV64IA-WMO-ZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13935; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2) 13936; RV64IA-WMO-ZACAS-NEXT: and a5, a3, a1 13937; RV64IA-WMO-ZACAS-NEXT: not a5, a5 13938; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 13939; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 13940; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 13941; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 13942; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB97_1 13943; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 13944; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 13945; RV64IA-WMO-ZACAS-NEXT: ret 13946; 13947; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_release: 13948; RV64IA-TSO-ZACAS: # %bb.0: 13949; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 13950; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 13951; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 13952; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 13953; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 13954; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 13955; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 13956; RV64IA-TSO-ZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13957; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 13958; RV64IA-TSO-ZACAS-NEXT: and a5, a3, a1 13959; RV64IA-TSO-ZACAS-NEXT: not a5, a5 13960; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 13961; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 13962; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 13963; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 13964; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB97_1 13965; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 13966; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 13967; RV64IA-TSO-ZACAS-NEXT: ret 13968; 13969; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_release: 13970; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 13971; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 13972; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 13973; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16 13974; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 13975; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 13976; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 13977; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 13978; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 13979; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2) 13980; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 13981; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 13982; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13983; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 13984; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 13985; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 13986; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB97_1 13987; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 13988; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 13989; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 13990; 13991; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_release: 13992; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 13993; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 13994; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 13995; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16 13996; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 13997; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 13998; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 13999; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 14000; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1 14001; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2) 14002; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 14003; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 14004; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14005; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 14006; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14007; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 14008; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB97_1 14009; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 14010; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 14011; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 14012; 14013; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_release: 14014; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 14015; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 14016; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 14017; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB97_1: # %atomicrmw.start 14018; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 14019; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 14020; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 14021; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 14022; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.rl a0, a3, (a2) 14023; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 14024; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB97_1 14025; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 14026; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 14027; 14028; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_release: 14029; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 14030; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 14031; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 14032; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB97_1: # %atomicrmw.start 14033; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 14034; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 14035; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 14036; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 14037; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2) 14038; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 14039; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB97_1 14040; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 14041; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 14042 %1 = atomicrmw nand ptr %a, i16 %b release 14043 ret i16 %1 14044} 14045 14046define i16 @atomicrmw_nand_i16_acq_rel(ptr %a, i16 %b) nounwind { 14047; RV32I-LABEL: atomicrmw_nand_i16_acq_rel: 14048; RV32I: # %bb.0: 14049; RV32I-NEXT: addi sp, sp, -16 14050; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14051; RV32I-NEXT: li a2, 4 14052; RV32I-NEXT: call __atomic_fetch_nand_2 14053; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14054; RV32I-NEXT: addi sp, sp, 16 14055; RV32I-NEXT: ret 14056; 14057; RV32IA-WMO-LABEL: atomicrmw_nand_i16_acq_rel: 14058; RV32IA-WMO: # %bb.0: 14059; RV32IA-WMO-NEXT: andi a2, a0, -4 14060; RV32IA-WMO-NEXT: slli a0, a0, 3 14061; RV32IA-WMO-NEXT: lui a3, 16 14062; RV32IA-WMO-NEXT: addi a3, a3, -1 14063; RV32IA-WMO-NEXT: sll a4, a3, a0 14064; RV32IA-WMO-NEXT: and a1, a1, a3 14065; RV32IA-WMO-NEXT: sll a1, a1, a0 14066; RV32IA-WMO-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14067; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 14068; RV32IA-WMO-NEXT: and a5, a3, a1 14069; RV32IA-WMO-NEXT: not a5, a5 14070; RV32IA-WMO-NEXT: xor a5, a3, a5 14071; RV32IA-WMO-NEXT: and a5, a5, a4 14072; RV32IA-WMO-NEXT: xor a5, a3, a5 14073; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 14074; RV32IA-WMO-NEXT: bnez a5, .LBB98_1 14075; RV32IA-WMO-NEXT: # %bb.2: 14076; RV32IA-WMO-NEXT: srl a0, a3, a0 14077; RV32IA-WMO-NEXT: ret 14078; 14079; RV32IA-TSO-LABEL: atomicrmw_nand_i16_acq_rel: 14080; RV32IA-TSO: # %bb.0: 14081; RV32IA-TSO-NEXT: andi a2, a0, -4 14082; RV32IA-TSO-NEXT: slli a0, a0, 3 14083; RV32IA-TSO-NEXT: lui a3, 16 14084; RV32IA-TSO-NEXT: addi a3, a3, -1 14085; RV32IA-TSO-NEXT: sll a4, a3, a0 14086; RV32IA-TSO-NEXT: and a1, a1, a3 14087; RV32IA-TSO-NEXT: sll a1, a1, a0 14088; RV32IA-TSO-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14089; RV32IA-TSO-NEXT: lr.w a3, (a2) 14090; RV32IA-TSO-NEXT: and a5, a3, a1 14091; RV32IA-TSO-NEXT: not a5, a5 14092; RV32IA-TSO-NEXT: xor a5, a3, a5 14093; RV32IA-TSO-NEXT: and a5, a5, a4 14094; RV32IA-TSO-NEXT: xor a5, a3, a5 14095; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 14096; RV32IA-TSO-NEXT: bnez a5, .LBB98_1 14097; RV32IA-TSO-NEXT: # %bb.2: 14098; RV32IA-TSO-NEXT: srl a0, a3, a0 14099; RV32IA-TSO-NEXT: ret 14100; 14101; RV64I-LABEL: atomicrmw_nand_i16_acq_rel: 14102; RV64I: # %bb.0: 14103; RV64I-NEXT: addi sp, sp, -16 14104; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14105; RV64I-NEXT: li a2, 4 14106; RV64I-NEXT: call __atomic_fetch_nand_2 14107; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14108; RV64I-NEXT: addi sp, sp, 16 14109; RV64I-NEXT: ret 14110; 14111; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14112; RV64IA-WMO-NOZACAS: # %bb.0: 14113; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 14114; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 14115; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 14116; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 14117; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 14118; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 14119; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 14120; RV64IA-WMO-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14121; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 14122; RV64IA-WMO-NOZACAS-NEXT: and a5, a3, a1 14123; RV64IA-WMO-NOZACAS-NEXT: not a5, a5 14124; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 14125; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 14126; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 14127; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 14128; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB98_1 14129; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 14130; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 14131; RV64IA-WMO-NOZACAS-NEXT: ret 14132; 14133; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14134; RV64IA-TSO-NOZACAS: # %bb.0: 14135; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 14136; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 14137; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 14138; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 14139; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 14140; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 14141; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 14142; RV64IA-TSO-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14143; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 14144; RV64IA-TSO-NOZACAS-NEXT: and a5, a3, a1 14145; RV64IA-TSO-NOZACAS-NEXT: not a5, a5 14146; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 14147; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 14148; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 14149; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 14150; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB98_1 14151; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 14152; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 14153; RV64IA-TSO-NOZACAS-NEXT: ret 14154; 14155; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14156; RV64IA-WMO-ZACAS: # %bb.0: 14157; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 14158; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 14159; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 14160; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 14161; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 14162; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 14163; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 14164; RV64IA-WMO-ZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14165; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 14166; RV64IA-WMO-ZACAS-NEXT: and a5, a3, a1 14167; RV64IA-WMO-ZACAS-NEXT: not a5, a5 14168; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 14169; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 14170; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 14171; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 14172; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB98_1 14173; RV64IA-WMO-ZACAS-NEXT: # %bb.2: 14174; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 14175; RV64IA-WMO-ZACAS-NEXT: ret 14176; 14177; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14178; RV64IA-TSO-ZACAS: # %bb.0: 14179; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 14180; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 14181; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 14182; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 14183; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 14184; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 14185; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 14186; RV64IA-TSO-ZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14187; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 14188; RV64IA-TSO-ZACAS-NEXT: and a5, a3, a1 14189; RV64IA-TSO-ZACAS-NEXT: not a5, a5 14190; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 14191; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 14192; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 14193; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 14194; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB98_1 14195; RV64IA-TSO-ZACAS-NEXT: # %bb.2: 14196; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 14197; RV64IA-TSO-ZACAS-NEXT: ret 14198; 14199; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14200; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 14201; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 14202; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 14203; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16 14204; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 14205; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 14206; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 14207; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 14208; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14209; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a3, (a2) 14210; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 14211; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 14212; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14213; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 14214; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14215; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 14216; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB98_1 14217; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 14218; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 14219; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 14220; 14221; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14222; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 14223; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 14224; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 14225; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16 14226; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 14227; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 14228; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 14229; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 14230; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1 14231; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2) 14232; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 14233; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 14234; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14235; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 14236; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14237; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2) 14238; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB98_1 14239; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 14240; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 14241; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 14242; 14243; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14244; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 14245; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 14246; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 14247; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB98_1: # %atomicrmw.start 14248; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 14249; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 14250; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 14251; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 14252; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aqrl a0, a3, (a2) 14253; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 14254; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB98_1 14255; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 14256; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 14257; 14258; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel: 14259; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 14260; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 14261; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 14262; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB98_1: # %atomicrmw.start 14263; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 14264; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 14265; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 14266; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 14267; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2) 14268; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 14269; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB98_1 14270; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 14271; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 14272 %1 = atomicrmw nand ptr %a, i16 %b acq_rel 14273 ret i16 %1 14274} 14275 14276define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind { 14277; RV32I-LABEL: atomicrmw_nand_i16_seq_cst: 14278; RV32I: # %bb.0: 14279; RV32I-NEXT: addi sp, sp, -16 14280; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14281; RV32I-NEXT: li a2, 5 14282; RV32I-NEXT: call __atomic_fetch_nand_2 14283; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14284; RV32I-NEXT: addi sp, sp, 16 14285; RV32I-NEXT: ret 14286; 14287; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst: 14288; RV32IA: # %bb.0: 14289; RV32IA-NEXT: andi a2, a0, -4 14290; RV32IA-NEXT: slli a0, a0, 3 14291; RV32IA-NEXT: lui a3, 16 14292; RV32IA-NEXT: addi a3, a3, -1 14293; RV32IA-NEXT: sll a4, a3, a0 14294; RV32IA-NEXT: and a1, a1, a3 14295; RV32IA-NEXT: sll a1, a1, a0 14296; RV32IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 14297; RV32IA-NEXT: lr.w.aqrl a3, (a2) 14298; RV32IA-NEXT: and a5, a3, a1 14299; RV32IA-NEXT: not a5, a5 14300; RV32IA-NEXT: xor a5, a3, a5 14301; RV32IA-NEXT: and a5, a5, a4 14302; RV32IA-NEXT: xor a5, a3, a5 14303; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 14304; RV32IA-NEXT: bnez a5, .LBB99_1 14305; RV32IA-NEXT: # %bb.2: 14306; RV32IA-NEXT: srl a0, a3, a0 14307; RV32IA-NEXT: ret 14308; 14309; RV64I-LABEL: atomicrmw_nand_i16_seq_cst: 14310; RV64I: # %bb.0: 14311; RV64I-NEXT: addi sp, sp, -16 14312; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14313; RV64I-NEXT: li a2, 5 14314; RV64I-NEXT: call __atomic_fetch_nand_2 14315; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14316; RV64I-NEXT: addi sp, sp, 16 14317; RV64I-NEXT: ret 14318; 14319; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst: 14320; RV64IA-NOZACAS: # %bb.0: 14321; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 14322; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 14323; RV64IA-NOZACAS-NEXT: lui a3, 16 14324; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 14325; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 14326; RV64IA-NOZACAS-NEXT: and a1, a1, a3 14327; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 14328; RV64IA-NOZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 14329; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 14330; RV64IA-NOZACAS-NEXT: and a5, a3, a1 14331; RV64IA-NOZACAS-NEXT: not a5, a5 14332; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 14333; RV64IA-NOZACAS-NEXT: and a5, a5, a4 14334; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 14335; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 14336; RV64IA-NOZACAS-NEXT: bnez a5, .LBB99_1 14337; RV64IA-NOZACAS-NEXT: # %bb.2: 14338; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 14339; RV64IA-NOZACAS-NEXT: ret 14340; 14341; RV64IA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst: 14342; RV64IA-ZACAS: # %bb.0: 14343; RV64IA-ZACAS-NEXT: andi a2, a0, -4 14344; RV64IA-ZACAS-NEXT: slli a0, a0, 3 14345; RV64IA-ZACAS-NEXT: lui a3, 16 14346; RV64IA-ZACAS-NEXT: addi a3, a3, -1 14347; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 14348; RV64IA-ZACAS-NEXT: and a1, a1, a3 14349; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 14350; RV64IA-ZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 14351; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2) 14352; RV64IA-ZACAS-NEXT: and a5, a3, a1 14353; RV64IA-ZACAS-NEXT: not a5, a5 14354; RV64IA-ZACAS-NEXT: xor a5, a3, a5 14355; RV64IA-ZACAS-NEXT: and a5, a5, a4 14356; RV64IA-ZACAS-NEXT: xor a5, a3, a5 14357; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 14358; RV64IA-ZACAS-NEXT: bnez a5, .LBB99_1 14359; RV64IA-ZACAS-NEXT: # %bb.2: 14360; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 14361; RV64IA-ZACAS-NEXT: ret 14362; 14363; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst: 14364; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 14365; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 14366; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 14367; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16 14368; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 14369; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 14370; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 14371; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 14372; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 14373; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 14374; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 14375; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5 14376; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14377; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 14378; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14379; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 14380; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB99_1 14381; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 14382; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 14383; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 14384; 14385; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst: 14386; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 14387; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4 14388; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3 14389; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16 14390; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1 14391; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0 14392; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3 14393; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0 14394; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1 14395; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 14396; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1 14397; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5 14398; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14399; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4 14400; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5 14401; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 14402; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB99_1 14403; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 14404; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0 14405; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 14406; 14407; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst: 14408; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 14409; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 14410; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 14411; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB99_1: # %atomicrmw.start 14412; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 14413; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1 14414; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw 14415; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3 14416; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 14417; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aqrl a0, a3, (a2) 14418; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 14419; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB99_1 14420; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 14421; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 14422; 14423; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst: 14424; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 14425; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 14426; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0) 14427; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB99_1: # %atomicrmw.start 14428; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 14429; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1 14430; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw 14431; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3 14432; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48 14433; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2) 14434; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48 14435; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB99_1 14436; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 14437; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 14438 %1 = atomicrmw nand ptr %a, i16 %b seq_cst 14439 ret i16 %1 14440} 14441 14442define i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind { 14443; RV32I-LABEL: atomicrmw_or_i16_monotonic: 14444; RV32I: # %bb.0: 14445; RV32I-NEXT: addi sp, sp, -16 14446; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14447; RV32I-NEXT: li a2, 0 14448; RV32I-NEXT: call __atomic_fetch_or_2 14449; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14450; RV32I-NEXT: addi sp, sp, 16 14451; RV32I-NEXT: ret 14452; 14453; RV32IA-LABEL: atomicrmw_or_i16_monotonic: 14454; RV32IA: # %bb.0: 14455; RV32IA-NEXT: andi a2, a0, -4 14456; RV32IA-NEXT: slli a0, a0, 3 14457; RV32IA-NEXT: slli a1, a1, 16 14458; RV32IA-NEXT: srli a1, a1, 16 14459; RV32IA-NEXT: sll a1, a1, a0 14460; RV32IA-NEXT: amoor.w a1, a1, (a2) 14461; RV32IA-NEXT: srl a0, a1, a0 14462; RV32IA-NEXT: ret 14463; 14464; RV64I-LABEL: atomicrmw_or_i16_monotonic: 14465; RV64I: # %bb.0: 14466; RV64I-NEXT: addi sp, sp, -16 14467; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14468; RV64I-NEXT: li a2, 0 14469; RV64I-NEXT: call __atomic_fetch_or_2 14470; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14471; RV64I-NEXT: addi sp, sp, 16 14472; RV64I-NEXT: ret 14473; 14474; RV64IA-NOZACAS-LABEL: atomicrmw_or_i16_monotonic: 14475; RV64IA-NOZACAS: # %bb.0: 14476; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 14477; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 14478; RV64IA-NOZACAS-NEXT: slli a1, a1, 48 14479; RV64IA-NOZACAS-NEXT: srli a1, a1, 48 14480; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 14481; RV64IA-NOZACAS-NEXT: amoor.w a1, a1, (a2) 14482; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 14483; RV64IA-NOZACAS-NEXT: ret 14484; 14485; RV64IA-ZACAS-LABEL: atomicrmw_or_i16_monotonic: 14486; RV64IA-ZACAS: # %bb.0: 14487; RV64IA-ZACAS-NEXT: andi a2, a0, -4 14488; RV64IA-ZACAS-NEXT: slli a0, a0, 3 14489; RV64IA-ZACAS-NEXT: slli a1, a1, 48 14490; RV64IA-ZACAS-NEXT: srli a1, a1, 48 14491; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 14492; RV64IA-ZACAS-NEXT: amoor.w a1, a1, (a2) 14493; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 14494; RV64IA-ZACAS-NEXT: ret 14495; 14496; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_monotonic: 14497; RV64IA-WMO-ZABHA: # %bb.0: 14498; RV64IA-WMO-ZABHA-NEXT: amoor.h a0, a1, (a0) 14499; RV64IA-WMO-ZABHA-NEXT: ret 14500; 14501; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_monotonic: 14502; RV64IA-TSO-ZABHA: # %bb.0: 14503; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0) 14504; RV64IA-TSO-ZABHA-NEXT: ret 14505 %1 = atomicrmw or ptr %a, i16 %b monotonic 14506 ret i16 %1 14507} 14508 14509define i16 @atomicrmw_or_i16_acquire(ptr %a, i16 %b) nounwind { 14510; RV32I-LABEL: atomicrmw_or_i16_acquire: 14511; RV32I: # %bb.0: 14512; RV32I-NEXT: addi sp, sp, -16 14513; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14514; RV32I-NEXT: li a2, 2 14515; RV32I-NEXT: call __atomic_fetch_or_2 14516; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14517; RV32I-NEXT: addi sp, sp, 16 14518; RV32I-NEXT: ret 14519; 14520; RV32IA-WMO-LABEL: atomicrmw_or_i16_acquire: 14521; RV32IA-WMO: # %bb.0: 14522; RV32IA-WMO-NEXT: andi a2, a0, -4 14523; RV32IA-WMO-NEXT: slli a0, a0, 3 14524; RV32IA-WMO-NEXT: slli a1, a1, 16 14525; RV32IA-WMO-NEXT: srli a1, a1, 16 14526; RV32IA-WMO-NEXT: sll a1, a1, a0 14527; RV32IA-WMO-NEXT: amoor.w.aq a1, a1, (a2) 14528; RV32IA-WMO-NEXT: srl a0, a1, a0 14529; RV32IA-WMO-NEXT: ret 14530; 14531; RV32IA-TSO-LABEL: atomicrmw_or_i16_acquire: 14532; RV32IA-TSO: # %bb.0: 14533; RV32IA-TSO-NEXT: andi a2, a0, -4 14534; RV32IA-TSO-NEXT: slli a0, a0, 3 14535; RV32IA-TSO-NEXT: slli a1, a1, 16 14536; RV32IA-TSO-NEXT: srli a1, a1, 16 14537; RV32IA-TSO-NEXT: sll a1, a1, a0 14538; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 14539; RV32IA-TSO-NEXT: srl a0, a1, a0 14540; RV32IA-TSO-NEXT: ret 14541; 14542; RV64I-LABEL: atomicrmw_or_i16_acquire: 14543; RV64I: # %bb.0: 14544; RV64I-NEXT: addi sp, sp, -16 14545; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14546; RV64I-NEXT: li a2, 2 14547; RV64I-NEXT: call __atomic_fetch_or_2 14548; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14549; RV64I-NEXT: addi sp, sp, 16 14550; RV64I-NEXT: ret 14551; 14552; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_acquire: 14553; RV64IA-WMO-NOZACAS: # %bb.0: 14554; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 14555; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 14556; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 14557; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 14558; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 14559; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a1, (a2) 14560; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 14561; RV64IA-WMO-NOZACAS-NEXT: ret 14562; 14563; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_acquire: 14564; RV64IA-TSO-NOZACAS: # %bb.0: 14565; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 14566; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 14567; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 14568; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 14569; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 14570; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 14571; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 14572; RV64IA-TSO-NOZACAS-NEXT: ret 14573; 14574; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_acquire: 14575; RV64IA-WMO-ZACAS: # %bb.0: 14576; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 14577; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 14578; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 14579; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 14580; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 14581; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a1, (a2) 14582; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 14583; RV64IA-WMO-ZACAS-NEXT: ret 14584; 14585; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_acquire: 14586; RV64IA-TSO-ZACAS: # %bb.0: 14587; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 14588; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 14589; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 14590; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 14591; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 14592; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 14593; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 14594; RV64IA-TSO-ZACAS-NEXT: ret 14595; 14596; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_acquire: 14597; RV64IA-WMO-ZABHA: # %bb.0: 14598; RV64IA-WMO-ZABHA-NEXT: amoor.h.aq a0, a1, (a0) 14599; RV64IA-WMO-ZABHA-NEXT: ret 14600; 14601; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_acquire: 14602; RV64IA-TSO-ZABHA: # %bb.0: 14603; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0) 14604; RV64IA-TSO-ZABHA-NEXT: ret 14605 %1 = atomicrmw or ptr %a, i16 %b acquire 14606 ret i16 %1 14607} 14608 14609define i16 @atomicrmw_or_i16_release(ptr %a, i16 %b) nounwind { 14610; RV32I-LABEL: atomicrmw_or_i16_release: 14611; RV32I: # %bb.0: 14612; RV32I-NEXT: addi sp, sp, -16 14613; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14614; RV32I-NEXT: li a2, 3 14615; RV32I-NEXT: call __atomic_fetch_or_2 14616; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14617; RV32I-NEXT: addi sp, sp, 16 14618; RV32I-NEXT: ret 14619; 14620; RV32IA-WMO-LABEL: atomicrmw_or_i16_release: 14621; RV32IA-WMO: # %bb.0: 14622; RV32IA-WMO-NEXT: andi a2, a0, -4 14623; RV32IA-WMO-NEXT: slli a0, a0, 3 14624; RV32IA-WMO-NEXT: slli a1, a1, 16 14625; RV32IA-WMO-NEXT: srli a1, a1, 16 14626; RV32IA-WMO-NEXT: sll a1, a1, a0 14627; RV32IA-WMO-NEXT: amoor.w.rl a1, a1, (a2) 14628; RV32IA-WMO-NEXT: srl a0, a1, a0 14629; RV32IA-WMO-NEXT: ret 14630; 14631; RV32IA-TSO-LABEL: atomicrmw_or_i16_release: 14632; RV32IA-TSO: # %bb.0: 14633; RV32IA-TSO-NEXT: andi a2, a0, -4 14634; RV32IA-TSO-NEXT: slli a0, a0, 3 14635; RV32IA-TSO-NEXT: slli a1, a1, 16 14636; RV32IA-TSO-NEXT: srli a1, a1, 16 14637; RV32IA-TSO-NEXT: sll a1, a1, a0 14638; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 14639; RV32IA-TSO-NEXT: srl a0, a1, a0 14640; RV32IA-TSO-NEXT: ret 14641; 14642; RV64I-LABEL: atomicrmw_or_i16_release: 14643; RV64I: # %bb.0: 14644; RV64I-NEXT: addi sp, sp, -16 14645; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14646; RV64I-NEXT: li a2, 3 14647; RV64I-NEXT: call __atomic_fetch_or_2 14648; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14649; RV64I-NEXT: addi sp, sp, 16 14650; RV64I-NEXT: ret 14651; 14652; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_release: 14653; RV64IA-WMO-NOZACAS: # %bb.0: 14654; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 14655; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 14656; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 14657; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 14658; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 14659; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a1, (a2) 14660; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 14661; RV64IA-WMO-NOZACAS-NEXT: ret 14662; 14663; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_release: 14664; RV64IA-TSO-NOZACAS: # %bb.0: 14665; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 14666; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 14667; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 14668; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 14669; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 14670; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 14671; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 14672; RV64IA-TSO-NOZACAS-NEXT: ret 14673; 14674; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_release: 14675; RV64IA-WMO-ZACAS: # %bb.0: 14676; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 14677; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 14678; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 14679; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 14680; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 14681; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a1, (a2) 14682; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 14683; RV64IA-WMO-ZACAS-NEXT: ret 14684; 14685; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_release: 14686; RV64IA-TSO-ZACAS: # %bb.0: 14687; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 14688; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 14689; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 14690; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 14691; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 14692; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 14693; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 14694; RV64IA-TSO-ZACAS-NEXT: ret 14695; 14696; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_release: 14697; RV64IA-WMO-ZABHA: # %bb.0: 14698; RV64IA-WMO-ZABHA-NEXT: amoor.h.rl a0, a1, (a0) 14699; RV64IA-WMO-ZABHA-NEXT: ret 14700; 14701; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_release: 14702; RV64IA-TSO-ZABHA: # %bb.0: 14703; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0) 14704; RV64IA-TSO-ZABHA-NEXT: ret 14705 %1 = atomicrmw or ptr %a, i16 %b release 14706 ret i16 %1 14707} 14708 14709define i16 @atomicrmw_or_i16_acq_rel(ptr %a, i16 %b) nounwind { 14710; RV32I-LABEL: atomicrmw_or_i16_acq_rel: 14711; RV32I: # %bb.0: 14712; RV32I-NEXT: addi sp, sp, -16 14713; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14714; RV32I-NEXT: li a2, 4 14715; RV32I-NEXT: call __atomic_fetch_or_2 14716; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14717; RV32I-NEXT: addi sp, sp, 16 14718; RV32I-NEXT: ret 14719; 14720; RV32IA-WMO-LABEL: atomicrmw_or_i16_acq_rel: 14721; RV32IA-WMO: # %bb.0: 14722; RV32IA-WMO-NEXT: andi a2, a0, -4 14723; RV32IA-WMO-NEXT: slli a0, a0, 3 14724; RV32IA-WMO-NEXT: slli a1, a1, 16 14725; RV32IA-WMO-NEXT: srli a1, a1, 16 14726; RV32IA-WMO-NEXT: sll a1, a1, a0 14727; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2) 14728; RV32IA-WMO-NEXT: srl a0, a1, a0 14729; RV32IA-WMO-NEXT: ret 14730; 14731; RV32IA-TSO-LABEL: atomicrmw_or_i16_acq_rel: 14732; RV32IA-TSO: # %bb.0: 14733; RV32IA-TSO-NEXT: andi a2, a0, -4 14734; RV32IA-TSO-NEXT: slli a0, a0, 3 14735; RV32IA-TSO-NEXT: slli a1, a1, 16 14736; RV32IA-TSO-NEXT: srli a1, a1, 16 14737; RV32IA-TSO-NEXT: sll a1, a1, a0 14738; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 14739; RV32IA-TSO-NEXT: srl a0, a1, a0 14740; RV32IA-TSO-NEXT: ret 14741; 14742; RV64I-LABEL: atomicrmw_or_i16_acq_rel: 14743; RV64I: # %bb.0: 14744; RV64I-NEXT: addi sp, sp, -16 14745; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14746; RV64I-NEXT: li a2, 4 14747; RV64I-NEXT: call __atomic_fetch_or_2 14748; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14749; RV64I-NEXT: addi sp, sp, 16 14750; RV64I-NEXT: ret 14751; 14752; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_acq_rel: 14753; RV64IA-WMO-NOZACAS: # %bb.0: 14754; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 14755; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 14756; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 14757; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 14758; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 14759; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 14760; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 14761; RV64IA-WMO-NOZACAS-NEXT: ret 14762; 14763; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_acq_rel: 14764; RV64IA-TSO-NOZACAS: # %bb.0: 14765; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 14766; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 14767; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 14768; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 14769; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 14770; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 14771; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 14772; RV64IA-TSO-NOZACAS-NEXT: ret 14773; 14774; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_acq_rel: 14775; RV64IA-WMO-ZACAS: # %bb.0: 14776; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 14777; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 14778; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 14779; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 14780; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 14781; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 14782; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 14783; RV64IA-WMO-ZACAS-NEXT: ret 14784; 14785; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_acq_rel: 14786; RV64IA-TSO-ZACAS: # %bb.0: 14787; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 14788; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 14789; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 14790; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 14791; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 14792; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 14793; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 14794; RV64IA-TSO-ZACAS-NEXT: ret 14795; 14796; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_acq_rel: 14797; RV64IA-WMO-ZABHA: # %bb.0: 14798; RV64IA-WMO-ZABHA-NEXT: amoor.h.aqrl a0, a1, (a0) 14799; RV64IA-WMO-ZABHA-NEXT: ret 14800; 14801; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_acq_rel: 14802; RV64IA-TSO-ZABHA: # %bb.0: 14803; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0) 14804; RV64IA-TSO-ZABHA-NEXT: ret 14805 %1 = atomicrmw or ptr %a, i16 %b acq_rel 14806 ret i16 %1 14807} 14808 14809define i16 @atomicrmw_or_i16_seq_cst(ptr %a, i16 %b) nounwind { 14810; RV32I-LABEL: atomicrmw_or_i16_seq_cst: 14811; RV32I: # %bb.0: 14812; RV32I-NEXT: addi sp, sp, -16 14813; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14814; RV32I-NEXT: li a2, 5 14815; RV32I-NEXT: call __atomic_fetch_or_2 14816; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14817; RV32I-NEXT: addi sp, sp, 16 14818; RV32I-NEXT: ret 14819; 14820; RV32IA-WMO-LABEL: atomicrmw_or_i16_seq_cst: 14821; RV32IA-WMO: # %bb.0: 14822; RV32IA-WMO-NEXT: andi a2, a0, -4 14823; RV32IA-WMO-NEXT: slli a0, a0, 3 14824; RV32IA-WMO-NEXT: slli a1, a1, 16 14825; RV32IA-WMO-NEXT: srli a1, a1, 16 14826; RV32IA-WMO-NEXT: sll a1, a1, a0 14827; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2) 14828; RV32IA-WMO-NEXT: srl a0, a1, a0 14829; RV32IA-WMO-NEXT: ret 14830; 14831; RV32IA-TSO-LABEL: atomicrmw_or_i16_seq_cst: 14832; RV32IA-TSO: # %bb.0: 14833; RV32IA-TSO-NEXT: andi a2, a0, -4 14834; RV32IA-TSO-NEXT: slli a0, a0, 3 14835; RV32IA-TSO-NEXT: slli a1, a1, 16 14836; RV32IA-TSO-NEXT: srli a1, a1, 16 14837; RV32IA-TSO-NEXT: sll a1, a1, a0 14838; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2) 14839; RV32IA-TSO-NEXT: srl a0, a1, a0 14840; RV32IA-TSO-NEXT: ret 14841; 14842; RV64I-LABEL: atomicrmw_or_i16_seq_cst: 14843; RV64I: # %bb.0: 14844; RV64I-NEXT: addi sp, sp, -16 14845; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14846; RV64I-NEXT: li a2, 5 14847; RV64I-NEXT: call __atomic_fetch_or_2 14848; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14849; RV64I-NEXT: addi sp, sp, 16 14850; RV64I-NEXT: ret 14851; 14852; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_seq_cst: 14853; RV64IA-WMO-NOZACAS: # %bb.0: 14854; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 14855; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 14856; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 14857; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 14858; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 14859; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 14860; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 14861; RV64IA-WMO-NOZACAS-NEXT: ret 14862; 14863; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_seq_cst: 14864; RV64IA-TSO-NOZACAS: # %bb.0: 14865; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 14866; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 14867; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 14868; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 14869; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 14870; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2) 14871; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 14872; RV64IA-TSO-NOZACAS-NEXT: ret 14873; 14874; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_seq_cst: 14875; RV64IA-WMO-ZACAS: # %bb.0: 14876; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 14877; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 14878; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 14879; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 14880; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 14881; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2) 14882; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 14883; RV64IA-WMO-ZACAS-NEXT: ret 14884; 14885; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_seq_cst: 14886; RV64IA-TSO-ZACAS: # %bb.0: 14887; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 14888; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 14889; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 14890; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 14891; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 14892; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2) 14893; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 14894; RV64IA-TSO-ZACAS-NEXT: ret 14895; 14896; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_seq_cst: 14897; RV64IA-WMO-ZABHA: # %bb.0: 14898; RV64IA-WMO-ZABHA-NEXT: amoor.h.aqrl a0, a1, (a0) 14899; RV64IA-WMO-ZABHA-NEXT: ret 14900; 14901; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_seq_cst: 14902; RV64IA-TSO-ZABHA: # %bb.0: 14903; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0) 14904; RV64IA-TSO-ZABHA-NEXT: ret 14905 %1 = atomicrmw or ptr %a, i16 %b seq_cst 14906 ret i16 %1 14907} 14908 14909define i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind { 14910; RV32I-LABEL: atomicrmw_xor_i16_monotonic: 14911; RV32I: # %bb.0: 14912; RV32I-NEXT: addi sp, sp, -16 14913; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14914; RV32I-NEXT: li a2, 0 14915; RV32I-NEXT: call __atomic_fetch_xor_2 14916; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14917; RV32I-NEXT: addi sp, sp, 16 14918; RV32I-NEXT: ret 14919; 14920; RV32IA-LABEL: atomicrmw_xor_i16_monotonic: 14921; RV32IA: # %bb.0: 14922; RV32IA-NEXT: andi a2, a0, -4 14923; RV32IA-NEXT: slli a0, a0, 3 14924; RV32IA-NEXT: slli a1, a1, 16 14925; RV32IA-NEXT: srli a1, a1, 16 14926; RV32IA-NEXT: sll a1, a1, a0 14927; RV32IA-NEXT: amoxor.w a1, a1, (a2) 14928; RV32IA-NEXT: srl a0, a1, a0 14929; RV32IA-NEXT: ret 14930; 14931; RV64I-LABEL: atomicrmw_xor_i16_monotonic: 14932; RV64I: # %bb.0: 14933; RV64I-NEXT: addi sp, sp, -16 14934; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 14935; RV64I-NEXT: li a2, 0 14936; RV64I-NEXT: call __atomic_fetch_xor_2 14937; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 14938; RV64I-NEXT: addi sp, sp, 16 14939; RV64I-NEXT: ret 14940; 14941; RV64IA-NOZACAS-LABEL: atomicrmw_xor_i16_monotonic: 14942; RV64IA-NOZACAS: # %bb.0: 14943; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 14944; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 14945; RV64IA-NOZACAS-NEXT: slli a1, a1, 48 14946; RV64IA-NOZACAS-NEXT: srli a1, a1, 48 14947; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 14948; RV64IA-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 14949; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0 14950; RV64IA-NOZACAS-NEXT: ret 14951; 14952; RV64IA-ZACAS-LABEL: atomicrmw_xor_i16_monotonic: 14953; RV64IA-ZACAS: # %bb.0: 14954; RV64IA-ZACAS-NEXT: andi a2, a0, -4 14955; RV64IA-ZACAS-NEXT: slli a0, a0, 3 14956; RV64IA-ZACAS-NEXT: slli a1, a1, 48 14957; RV64IA-ZACAS-NEXT: srli a1, a1, 48 14958; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 14959; RV64IA-ZACAS-NEXT: amoxor.w a1, a1, (a2) 14960; RV64IA-ZACAS-NEXT: srlw a0, a1, a0 14961; RV64IA-ZACAS-NEXT: ret 14962; 14963; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_monotonic: 14964; RV64IA-WMO-ZABHA: # %bb.0: 14965; RV64IA-WMO-ZABHA-NEXT: amoxor.h a0, a1, (a0) 14966; RV64IA-WMO-ZABHA-NEXT: ret 14967; 14968; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_monotonic: 14969; RV64IA-TSO-ZABHA: # %bb.0: 14970; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0) 14971; RV64IA-TSO-ZABHA-NEXT: ret 14972 %1 = atomicrmw xor ptr %a, i16 %b monotonic 14973 ret i16 %1 14974} 14975 14976define i16 @atomicrmw_xor_i16_acquire(ptr %a, i16 %b) nounwind { 14977; RV32I-LABEL: atomicrmw_xor_i16_acquire: 14978; RV32I: # %bb.0: 14979; RV32I-NEXT: addi sp, sp, -16 14980; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 14981; RV32I-NEXT: li a2, 2 14982; RV32I-NEXT: call __atomic_fetch_xor_2 14983; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 14984; RV32I-NEXT: addi sp, sp, 16 14985; RV32I-NEXT: ret 14986; 14987; RV32IA-WMO-LABEL: atomicrmw_xor_i16_acquire: 14988; RV32IA-WMO: # %bb.0: 14989; RV32IA-WMO-NEXT: andi a2, a0, -4 14990; RV32IA-WMO-NEXT: slli a0, a0, 3 14991; RV32IA-WMO-NEXT: slli a1, a1, 16 14992; RV32IA-WMO-NEXT: srli a1, a1, 16 14993; RV32IA-WMO-NEXT: sll a1, a1, a0 14994; RV32IA-WMO-NEXT: amoxor.w.aq a1, a1, (a2) 14995; RV32IA-WMO-NEXT: srl a0, a1, a0 14996; RV32IA-WMO-NEXT: ret 14997; 14998; RV32IA-TSO-LABEL: atomicrmw_xor_i16_acquire: 14999; RV32IA-TSO: # %bb.0: 15000; RV32IA-TSO-NEXT: andi a2, a0, -4 15001; RV32IA-TSO-NEXT: slli a0, a0, 3 15002; RV32IA-TSO-NEXT: slli a1, a1, 16 15003; RV32IA-TSO-NEXT: srli a1, a1, 16 15004; RV32IA-TSO-NEXT: sll a1, a1, a0 15005; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 15006; RV32IA-TSO-NEXT: srl a0, a1, a0 15007; RV32IA-TSO-NEXT: ret 15008; 15009; RV64I-LABEL: atomicrmw_xor_i16_acquire: 15010; RV64I: # %bb.0: 15011; RV64I-NEXT: addi sp, sp, -16 15012; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 15013; RV64I-NEXT: li a2, 2 15014; RV64I-NEXT: call __atomic_fetch_xor_2 15015; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 15016; RV64I-NEXT: addi sp, sp, 16 15017; RV64I-NEXT: ret 15018; 15019; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_acquire: 15020; RV64IA-WMO-NOZACAS: # %bb.0: 15021; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 15022; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 15023; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 15024; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 15025; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 15026; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aq a1, a1, (a2) 15027; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 15028; RV64IA-WMO-NOZACAS-NEXT: ret 15029; 15030; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_acquire: 15031; RV64IA-TSO-NOZACAS: # %bb.0: 15032; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 15033; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 15034; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 15035; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 15036; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 15037; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 15038; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 15039; RV64IA-TSO-NOZACAS-NEXT: ret 15040; 15041; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_acquire: 15042; RV64IA-WMO-ZACAS: # %bb.0: 15043; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 15044; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 15045; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 15046; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 15047; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 15048; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aq a1, a1, (a2) 15049; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 15050; RV64IA-WMO-ZACAS-NEXT: ret 15051; 15052; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_acquire: 15053; RV64IA-TSO-ZACAS: # %bb.0: 15054; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 15055; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 15056; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 15057; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 15058; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 15059; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 15060; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 15061; RV64IA-TSO-ZACAS-NEXT: ret 15062; 15063; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_acquire: 15064; RV64IA-WMO-ZABHA: # %bb.0: 15065; RV64IA-WMO-ZABHA-NEXT: amoxor.h.aq a0, a1, (a0) 15066; RV64IA-WMO-ZABHA-NEXT: ret 15067; 15068; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_acquire: 15069; RV64IA-TSO-ZABHA: # %bb.0: 15070; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0) 15071; RV64IA-TSO-ZABHA-NEXT: ret 15072 %1 = atomicrmw xor ptr %a, i16 %b acquire 15073 ret i16 %1 15074} 15075 15076define i16 @atomicrmw_xor_i16_release(ptr %a, i16 %b) nounwind { 15077; RV32I-LABEL: atomicrmw_xor_i16_release: 15078; RV32I: # %bb.0: 15079; RV32I-NEXT: addi sp, sp, -16 15080; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 15081; RV32I-NEXT: li a2, 3 15082; RV32I-NEXT: call __atomic_fetch_xor_2 15083; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 15084; RV32I-NEXT: addi sp, sp, 16 15085; RV32I-NEXT: ret 15086; 15087; RV32IA-WMO-LABEL: atomicrmw_xor_i16_release: 15088; RV32IA-WMO: # %bb.0: 15089; RV32IA-WMO-NEXT: andi a2, a0, -4 15090; RV32IA-WMO-NEXT: slli a0, a0, 3 15091; RV32IA-WMO-NEXT: slli a1, a1, 16 15092; RV32IA-WMO-NEXT: srli a1, a1, 16 15093; RV32IA-WMO-NEXT: sll a1, a1, a0 15094; RV32IA-WMO-NEXT: amoxor.w.rl a1, a1, (a2) 15095; RV32IA-WMO-NEXT: srl a0, a1, a0 15096; RV32IA-WMO-NEXT: ret 15097; 15098; RV32IA-TSO-LABEL: atomicrmw_xor_i16_release: 15099; RV32IA-TSO: # %bb.0: 15100; RV32IA-TSO-NEXT: andi a2, a0, -4 15101; RV32IA-TSO-NEXT: slli a0, a0, 3 15102; RV32IA-TSO-NEXT: slli a1, a1, 16 15103; RV32IA-TSO-NEXT: srli a1, a1, 16 15104; RV32IA-TSO-NEXT: sll a1, a1, a0 15105; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 15106; RV32IA-TSO-NEXT: srl a0, a1, a0 15107; RV32IA-TSO-NEXT: ret 15108; 15109; RV64I-LABEL: atomicrmw_xor_i16_release: 15110; RV64I: # %bb.0: 15111; RV64I-NEXT: addi sp, sp, -16 15112; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 15113; RV64I-NEXT: li a2, 3 15114; RV64I-NEXT: call __atomic_fetch_xor_2 15115; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 15116; RV64I-NEXT: addi sp, sp, 16 15117; RV64I-NEXT: ret 15118; 15119; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_release: 15120; RV64IA-WMO-NOZACAS: # %bb.0: 15121; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 15122; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 15123; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 15124; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 15125; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 15126; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.rl a1, a1, (a2) 15127; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 15128; RV64IA-WMO-NOZACAS-NEXT: ret 15129; 15130; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_release: 15131; RV64IA-TSO-NOZACAS: # %bb.0: 15132; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 15133; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 15134; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 15135; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 15136; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 15137; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 15138; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 15139; RV64IA-TSO-NOZACAS-NEXT: ret 15140; 15141; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_release: 15142; RV64IA-WMO-ZACAS: # %bb.0: 15143; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 15144; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 15145; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 15146; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 15147; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 15148; RV64IA-WMO-ZACAS-NEXT: amoxor.w.rl a1, a1, (a2) 15149; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 15150; RV64IA-WMO-ZACAS-NEXT: ret 15151; 15152; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_release: 15153; RV64IA-TSO-ZACAS: # %bb.0: 15154; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 15155; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 15156; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 15157; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 15158; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 15159; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 15160; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 15161; RV64IA-TSO-ZACAS-NEXT: ret 15162; 15163; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_release: 15164; RV64IA-WMO-ZABHA: # %bb.0: 15165; RV64IA-WMO-ZABHA-NEXT: amoxor.h.rl a0, a1, (a0) 15166; RV64IA-WMO-ZABHA-NEXT: ret 15167; 15168; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_release: 15169; RV64IA-TSO-ZABHA: # %bb.0: 15170; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0) 15171; RV64IA-TSO-ZABHA-NEXT: ret 15172 %1 = atomicrmw xor ptr %a, i16 %b release 15173 ret i16 %1 15174} 15175 15176define i16 @atomicrmw_xor_i16_acq_rel(ptr %a, i16 %b) nounwind { 15177; RV32I-LABEL: atomicrmw_xor_i16_acq_rel: 15178; RV32I: # %bb.0: 15179; RV32I-NEXT: addi sp, sp, -16 15180; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 15181; RV32I-NEXT: li a2, 4 15182; RV32I-NEXT: call __atomic_fetch_xor_2 15183; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 15184; RV32I-NEXT: addi sp, sp, 16 15185; RV32I-NEXT: ret 15186; 15187; RV32IA-WMO-LABEL: atomicrmw_xor_i16_acq_rel: 15188; RV32IA-WMO: # %bb.0: 15189; RV32IA-WMO-NEXT: andi a2, a0, -4 15190; RV32IA-WMO-NEXT: slli a0, a0, 3 15191; RV32IA-WMO-NEXT: slli a1, a1, 16 15192; RV32IA-WMO-NEXT: srli a1, a1, 16 15193; RV32IA-WMO-NEXT: sll a1, a1, a0 15194; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2) 15195; RV32IA-WMO-NEXT: srl a0, a1, a0 15196; RV32IA-WMO-NEXT: ret 15197; 15198; RV32IA-TSO-LABEL: atomicrmw_xor_i16_acq_rel: 15199; RV32IA-TSO: # %bb.0: 15200; RV32IA-TSO-NEXT: andi a2, a0, -4 15201; RV32IA-TSO-NEXT: slli a0, a0, 3 15202; RV32IA-TSO-NEXT: slli a1, a1, 16 15203; RV32IA-TSO-NEXT: srli a1, a1, 16 15204; RV32IA-TSO-NEXT: sll a1, a1, a0 15205; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 15206; RV32IA-TSO-NEXT: srl a0, a1, a0 15207; RV32IA-TSO-NEXT: ret 15208; 15209; RV64I-LABEL: atomicrmw_xor_i16_acq_rel: 15210; RV64I: # %bb.0: 15211; RV64I-NEXT: addi sp, sp, -16 15212; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 15213; RV64I-NEXT: li a2, 4 15214; RV64I-NEXT: call __atomic_fetch_xor_2 15215; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 15216; RV64I-NEXT: addi sp, sp, 16 15217; RV64I-NEXT: ret 15218; 15219; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_acq_rel: 15220; RV64IA-WMO-NOZACAS: # %bb.0: 15221; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 15222; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 15223; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 15224; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 15225; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 15226; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 15227; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 15228; RV64IA-WMO-NOZACAS-NEXT: ret 15229; 15230; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_acq_rel: 15231; RV64IA-TSO-NOZACAS: # %bb.0: 15232; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 15233; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 15234; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 15235; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 15236; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 15237; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 15238; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 15239; RV64IA-TSO-NOZACAS-NEXT: ret 15240; 15241; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_acq_rel: 15242; RV64IA-WMO-ZACAS: # %bb.0: 15243; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 15244; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 15245; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 15246; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 15247; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 15248; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 15249; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 15250; RV64IA-WMO-ZACAS-NEXT: ret 15251; 15252; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_acq_rel: 15253; RV64IA-TSO-ZACAS: # %bb.0: 15254; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 15255; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 15256; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 15257; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 15258; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 15259; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 15260; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 15261; RV64IA-TSO-ZACAS-NEXT: ret 15262; 15263; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_acq_rel: 15264; RV64IA-WMO-ZABHA: # %bb.0: 15265; RV64IA-WMO-ZABHA-NEXT: amoxor.h.aqrl a0, a1, (a0) 15266; RV64IA-WMO-ZABHA-NEXT: ret 15267; 15268; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_acq_rel: 15269; RV64IA-TSO-ZABHA: # %bb.0: 15270; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0) 15271; RV64IA-TSO-ZABHA-NEXT: ret 15272 %1 = atomicrmw xor ptr %a, i16 %b acq_rel 15273 ret i16 %1 15274} 15275 15276define i16 @atomicrmw_xor_i16_seq_cst(ptr %a, i16 %b) nounwind { 15277; RV32I-LABEL: atomicrmw_xor_i16_seq_cst: 15278; RV32I: # %bb.0: 15279; RV32I-NEXT: addi sp, sp, -16 15280; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 15281; RV32I-NEXT: li a2, 5 15282; RV32I-NEXT: call __atomic_fetch_xor_2 15283; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 15284; RV32I-NEXT: addi sp, sp, 16 15285; RV32I-NEXT: ret 15286; 15287; RV32IA-WMO-LABEL: atomicrmw_xor_i16_seq_cst: 15288; RV32IA-WMO: # %bb.0: 15289; RV32IA-WMO-NEXT: andi a2, a0, -4 15290; RV32IA-WMO-NEXT: slli a0, a0, 3 15291; RV32IA-WMO-NEXT: slli a1, a1, 16 15292; RV32IA-WMO-NEXT: srli a1, a1, 16 15293; RV32IA-WMO-NEXT: sll a1, a1, a0 15294; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2) 15295; RV32IA-WMO-NEXT: srl a0, a1, a0 15296; RV32IA-WMO-NEXT: ret 15297; 15298; RV32IA-TSO-LABEL: atomicrmw_xor_i16_seq_cst: 15299; RV32IA-TSO: # %bb.0: 15300; RV32IA-TSO-NEXT: andi a2, a0, -4 15301; RV32IA-TSO-NEXT: slli a0, a0, 3 15302; RV32IA-TSO-NEXT: slli a1, a1, 16 15303; RV32IA-TSO-NEXT: srli a1, a1, 16 15304; RV32IA-TSO-NEXT: sll a1, a1, a0 15305; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2) 15306; RV32IA-TSO-NEXT: srl a0, a1, a0 15307; RV32IA-TSO-NEXT: ret 15308; 15309; RV64I-LABEL: atomicrmw_xor_i16_seq_cst: 15310; RV64I: # %bb.0: 15311; RV64I-NEXT: addi sp, sp, -16 15312; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 15313; RV64I-NEXT: li a2, 5 15314; RV64I-NEXT: call __atomic_fetch_xor_2 15315; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 15316; RV64I-NEXT: addi sp, sp, 16 15317; RV64I-NEXT: ret 15318; 15319; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_seq_cst: 15320; RV64IA-WMO-NOZACAS: # %bb.0: 15321; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 15322; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 15323; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 15324; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48 15325; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 15326; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 15327; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0 15328; RV64IA-WMO-NOZACAS-NEXT: ret 15329; 15330; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_seq_cst: 15331; RV64IA-TSO-NOZACAS: # %bb.0: 15332; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 15333; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 15334; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 15335; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48 15336; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 15337; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2) 15338; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0 15339; RV64IA-TSO-NOZACAS-NEXT: ret 15340; 15341; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_seq_cst: 15342; RV64IA-WMO-ZACAS: # %bb.0: 15343; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 15344; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 15345; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 15346; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48 15347; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 15348; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2) 15349; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0 15350; RV64IA-WMO-ZACAS-NEXT: ret 15351; 15352; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_seq_cst: 15353; RV64IA-TSO-ZACAS: # %bb.0: 15354; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 15355; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 15356; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 15357; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48 15358; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 15359; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2) 15360; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0 15361; RV64IA-TSO-ZACAS-NEXT: ret 15362; 15363; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_seq_cst: 15364; RV64IA-WMO-ZABHA: # %bb.0: 15365; RV64IA-WMO-ZABHA-NEXT: amoxor.h.aqrl a0, a1, (a0) 15366; RV64IA-WMO-ZABHA-NEXT: ret 15367; 15368; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_seq_cst: 15369; RV64IA-TSO-ZABHA: # %bb.0: 15370; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0) 15371; RV64IA-TSO-ZABHA-NEXT: ret 15372 %1 = atomicrmw xor ptr %a, i16 %b seq_cst 15373 ret i16 %1 15374} 15375 15376define i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind { 15377; RV32I-LABEL: atomicrmw_max_i16_monotonic: 15378; RV32I: # %bb.0: 15379; RV32I-NEXT: addi sp, sp, -32 15380; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15381; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15382; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15383; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15384; RV32I-NEXT: mv s0, a0 15385; RV32I-NEXT: lhu a3, 0(a0) 15386; RV32I-NEXT: mv s1, a1 15387; RV32I-NEXT: slli a0, a1, 16 15388; RV32I-NEXT: srai s2, a0, 16 15389; RV32I-NEXT: j .LBB110_2 15390; RV32I-NEXT: .LBB110_1: # %atomicrmw.start 15391; RV32I-NEXT: # in Loop: Header=BB110_2 Depth=1 15392; RV32I-NEXT: sh a3, 14(sp) 15393; RV32I-NEXT: addi a1, sp, 14 15394; RV32I-NEXT: mv a0, s0 15395; RV32I-NEXT: li a3, 0 15396; RV32I-NEXT: li a4, 0 15397; RV32I-NEXT: call __atomic_compare_exchange_2 15398; RV32I-NEXT: lh a3, 14(sp) 15399; RV32I-NEXT: bnez a0, .LBB110_4 15400; RV32I-NEXT: .LBB110_2: # %atomicrmw.start 15401; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15402; RV32I-NEXT: slli a0, a3, 16 15403; RV32I-NEXT: srai a0, a0, 16 15404; RV32I-NEXT: mv a2, a3 15405; RV32I-NEXT: blt s2, a0, .LBB110_1 15406; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15407; RV32I-NEXT: # in Loop: Header=BB110_2 Depth=1 15408; RV32I-NEXT: mv a2, s1 15409; RV32I-NEXT: j .LBB110_1 15410; RV32I-NEXT: .LBB110_4: # %atomicrmw.end 15411; RV32I-NEXT: mv a0, a3 15412; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15413; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15414; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15415; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15416; RV32I-NEXT: addi sp, sp, 32 15417; RV32I-NEXT: ret 15418; 15419; RV32IA-LABEL: atomicrmw_max_i16_monotonic: 15420; RV32IA: # %bb.0: 15421; RV32IA-NEXT: andi a2, a0, -4 15422; RV32IA-NEXT: slli a0, a0, 3 15423; RV32IA-NEXT: lui a3, 16 15424; RV32IA-NEXT: slli a1, a1, 16 15425; RV32IA-NEXT: li a4, 16 15426; RV32IA-NEXT: andi a5, a0, 24 15427; RV32IA-NEXT: addi a3, a3, -1 15428; RV32IA-NEXT: srai a1, a1, 16 15429; RV32IA-NEXT: sll a3, a3, a0 15430; RV32IA-NEXT: sll a1, a1, a0 15431; RV32IA-NEXT: sub a4, a4, a5 15432; RV32IA-NEXT: .LBB110_1: # =>This Inner Loop Header: Depth=1 15433; RV32IA-NEXT: lr.w a5, (a2) 15434; RV32IA-NEXT: and a7, a5, a3 15435; RV32IA-NEXT: mv a6, a5 15436; RV32IA-NEXT: sll a7, a7, a4 15437; RV32IA-NEXT: sra a7, a7, a4 15438; RV32IA-NEXT: bge a7, a1, .LBB110_3 15439; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB110_1 Depth=1 15440; RV32IA-NEXT: xor a6, a5, a1 15441; RV32IA-NEXT: and a6, a6, a3 15442; RV32IA-NEXT: xor a6, a5, a6 15443; RV32IA-NEXT: .LBB110_3: # in Loop: Header=BB110_1 Depth=1 15444; RV32IA-NEXT: sc.w a6, a6, (a2) 15445; RV32IA-NEXT: bnez a6, .LBB110_1 15446; RV32IA-NEXT: # %bb.4: 15447; RV32IA-NEXT: srl a0, a5, a0 15448; RV32IA-NEXT: ret 15449; 15450; RV64I-LABEL: atomicrmw_max_i16_monotonic: 15451; RV64I: # %bb.0: 15452; RV64I-NEXT: addi sp, sp, -48 15453; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 15454; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 15455; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 15456; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 15457; RV64I-NEXT: mv s0, a0 15458; RV64I-NEXT: lhu a3, 0(a0) 15459; RV64I-NEXT: mv s1, a1 15460; RV64I-NEXT: slli a0, a1, 48 15461; RV64I-NEXT: srai s2, a0, 48 15462; RV64I-NEXT: j .LBB110_2 15463; RV64I-NEXT: .LBB110_1: # %atomicrmw.start 15464; RV64I-NEXT: # in Loop: Header=BB110_2 Depth=1 15465; RV64I-NEXT: sh a3, 14(sp) 15466; RV64I-NEXT: addi a1, sp, 14 15467; RV64I-NEXT: mv a0, s0 15468; RV64I-NEXT: li a3, 0 15469; RV64I-NEXT: li a4, 0 15470; RV64I-NEXT: call __atomic_compare_exchange_2 15471; RV64I-NEXT: lh a3, 14(sp) 15472; RV64I-NEXT: bnez a0, .LBB110_4 15473; RV64I-NEXT: .LBB110_2: # %atomicrmw.start 15474; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15475; RV64I-NEXT: slli a0, a3, 48 15476; RV64I-NEXT: srai a0, a0, 48 15477; RV64I-NEXT: mv a2, a3 15478; RV64I-NEXT: blt s2, a0, .LBB110_1 15479; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15480; RV64I-NEXT: # in Loop: Header=BB110_2 Depth=1 15481; RV64I-NEXT: mv a2, s1 15482; RV64I-NEXT: j .LBB110_1 15483; RV64I-NEXT: .LBB110_4: # %atomicrmw.end 15484; RV64I-NEXT: mv a0, a3 15485; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 15486; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 15487; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 15488; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 15489; RV64I-NEXT: addi sp, sp, 48 15490; RV64I-NEXT: ret 15491; 15492; RV64IA-NOZACAS-LABEL: atomicrmw_max_i16_monotonic: 15493; RV64IA-NOZACAS: # %bb.0: 15494; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 15495; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 15496; RV64IA-NOZACAS-NEXT: lui a3, 16 15497; RV64IA-NOZACAS-NEXT: slli a1, a1, 48 15498; RV64IA-NOZACAS-NEXT: li a4, 48 15499; RV64IA-NOZACAS-NEXT: andi a5, a0, 24 15500; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 15501; RV64IA-NOZACAS-NEXT: srai a1, a1, 48 15502; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 15503; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 15504; RV64IA-NOZACAS-NEXT: sub a4, a4, a5 15505; RV64IA-NOZACAS-NEXT: .LBB110_1: # =>This Inner Loop Header: Depth=1 15506; RV64IA-NOZACAS-NEXT: lr.w a5, (a2) 15507; RV64IA-NOZACAS-NEXT: and a7, a5, a3 15508; RV64IA-NOZACAS-NEXT: mv a6, a5 15509; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 15510; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 15511; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB110_3 15512; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB110_1 Depth=1 15513; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 15514; RV64IA-NOZACAS-NEXT: and a6, a6, a3 15515; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 15516; RV64IA-NOZACAS-NEXT: .LBB110_3: # in Loop: Header=BB110_1 Depth=1 15517; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2) 15518; RV64IA-NOZACAS-NEXT: bnez a6, .LBB110_1 15519; RV64IA-NOZACAS-NEXT: # %bb.4: 15520; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 15521; RV64IA-NOZACAS-NEXT: ret 15522; 15523; RV64IA-ZACAS-LABEL: atomicrmw_max_i16_monotonic: 15524; RV64IA-ZACAS: # %bb.0: 15525; RV64IA-ZACAS-NEXT: andi a2, a0, -4 15526; RV64IA-ZACAS-NEXT: slli a0, a0, 3 15527; RV64IA-ZACAS-NEXT: lui a3, 16 15528; RV64IA-ZACAS-NEXT: slli a1, a1, 48 15529; RV64IA-ZACAS-NEXT: li a4, 48 15530; RV64IA-ZACAS-NEXT: andi a5, a0, 24 15531; RV64IA-ZACAS-NEXT: addi a3, a3, -1 15532; RV64IA-ZACAS-NEXT: srai a1, a1, 48 15533; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 15534; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 15535; RV64IA-ZACAS-NEXT: sub a4, a4, a5 15536; RV64IA-ZACAS-NEXT: .LBB110_1: # =>This Inner Loop Header: Depth=1 15537; RV64IA-ZACAS-NEXT: lr.w a5, (a2) 15538; RV64IA-ZACAS-NEXT: and a7, a5, a3 15539; RV64IA-ZACAS-NEXT: mv a6, a5 15540; RV64IA-ZACAS-NEXT: sll a7, a7, a4 15541; RV64IA-ZACAS-NEXT: sra a7, a7, a4 15542; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB110_3 15543; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB110_1 Depth=1 15544; RV64IA-ZACAS-NEXT: xor a6, a5, a1 15545; RV64IA-ZACAS-NEXT: and a6, a6, a3 15546; RV64IA-ZACAS-NEXT: xor a6, a5, a6 15547; RV64IA-ZACAS-NEXT: .LBB110_3: # in Loop: Header=BB110_1 Depth=1 15548; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2) 15549; RV64IA-ZACAS-NEXT: bnez a6, .LBB110_1 15550; RV64IA-ZACAS-NEXT: # %bb.4: 15551; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 15552; RV64IA-ZACAS-NEXT: ret 15553; 15554; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_monotonic: 15555; RV64IA-WMO-ZABHA: # %bb.0: 15556; RV64IA-WMO-ZABHA-NEXT: amomax.h a0, a1, (a0) 15557; RV64IA-WMO-ZABHA-NEXT: ret 15558; 15559; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_monotonic: 15560; RV64IA-TSO-ZABHA: # %bb.0: 15561; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0) 15562; RV64IA-TSO-ZABHA-NEXT: ret 15563 %1 = atomicrmw max ptr %a, i16 %b monotonic 15564 ret i16 %1 15565} 15566 15567define i16 @atomicrmw_max_i16_acquire(ptr %a, i16 %b) nounwind { 15568; RV32I-LABEL: atomicrmw_max_i16_acquire: 15569; RV32I: # %bb.0: 15570; RV32I-NEXT: addi sp, sp, -32 15571; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15572; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15573; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15574; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15575; RV32I-NEXT: mv s0, a0 15576; RV32I-NEXT: lhu a3, 0(a0) 15577; RV32I-NEXT: mv s1, a1 15578; RV32I-NEXT: slli a0, a1, 16 15579; RV32I-NEXT: srai s2, a0, 16 15580; RV32I-NEXT: j .LBB111_2 15581; RV32I-NEXT: .LBB111_1: # %atomicrmw.start 15582; RV32I-NEXT: # in Loop: Header=BB111_2 Depth=1 15583; RV32I-NEXT: sh a3, 14(sp) 15584; RV32I-NEXT: addi a1, sp, 14 15585; RV32I-NEXT: li a3, 2 15586; RV32I-NEXT: li a4, 2 15587; RV32I-NEXT: mv a0, s0 15588; RV32I-NEXT: call __atomic_compare_exchange_2 15589; RV32I-NEXT: lh a3, 14(sp) 15590; RV32I-NEXT: bnez a0, .LBB111_4 15591; RV32I-NEXT: .LBB111_2: # %atomicrmw.start 15592; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15593; RV32I-NEXT: slli a0, a3, 16 15594; RV32I-NEXT: srai a0, a0, 16 15595; RV32I-NEXT: mv a2, a3 15596; RV32I-NEXT: blt s2, a0, .LBB111_1 15597; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15598; RV32I-NEXT: # in Loop: Header=BB111_2 Depth=1 15599; RV32I-NEXT: mv a2, s1 15600; RV32I-NEXT: j .LBB111_1 15601; RV32I-NEXT: .LBB111_4: # %atomicrmw.end 15602; RV32I-NEXT: mv a0, a3 15603; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15604; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15605; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15606; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15607; RV32I-NEXT: addi sp, sp, 32 15608; RV32I-NEXT: ret 15609; 15610; RV32IA-WMO-LABEL: atomicrmw_max_i16_acquire: 15611; RV32IA-WMO: # %bb.0: 15612; RV32IA-WMO-NEXT: andi a2, a0, -4 15613; RV32IA-WMO-NEXT: slli a0, a0, 3 15614; RV32IA-WMO-NEXT: lui a3, 16 15615; RV32IA-WMO-NEXT: slli a1, a1, 16 15616; RV32IA-WMO-NEXT: li a4, 16 15617; RV32IA-WMO-NEXT: andi a5, a0, 24 15618; RV32IA-WMO-NEXT: addi a3, a3, -1 15619; RV32IA-WMO-NEXT: srai a1, a1, 16 15620; RV32IA-WMO-NEXT: sll a3, a3, a0 15621; RV32IA-WMO-NEXT: sll a1, a1, a0 15622; RV32IA-WMO-NEXT: sub a4, a4, a5 15623; RV32IA-WMO-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1 15624; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 15625; RV32IA-WMO-NEXT: and a7, a5, a3 15626; RV32IA-WMO-NEXT: mv a6, a5 15627; RV32IA-WMO-NEXT: sll a7, a7, a4 15628; RV32IA-WMO-NEXT: sra a7, a7, a4 15629; RV32IA-WMO-NEXT: bge a7, a1, .LBB111_3 15630; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1 15631; RV32IA-WMO-NEXT: xor a6, a5, a1 15632; RV32IA-WMO-NEXT: and a6, a6, a3 15633; RV32IA-WMO-NEXT: xor a6, a5, a6 15634; RV32IA-WMO-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1 15635; RV32IA-WMO-NEXT: sc.w a6, a6, (a2) 15636; RV32IA-WMO-NEXT: bnez a6, .LBB111_1 15637; RV32IA-WMO-NEXT: # %bb.4: 15638; RV32IA-WMO-NEXT: srl a0, a5, a0 15639; RV32IA-WMO-NEXT: ret 15640; 15641; RV32IA-TSO-LABEL: atomicrmw_max_i16_acquire: 15642; RV32IA-TSO: # %bb.0: 15643; RV32IA-TSO-NEXT: andi a2, a0, -4 15644; RV32IA-TSO-NEXT: slli a0, a0, 3 15645; RV32IA-TSO-NEXT: lui a3, 16 15646; RV32IA-TSO-NEXT: slli a1, a1, 16 15647; RV32IA-TSO-NEXT: li a4, 16 15648; RV32IA-TSO-NEXT: andi a5, a0, 24 15649; RV32IA-TSO-NEXT: addi a3, a3, -1 15650; RV32IA-TSO-NEXT: srai a1, a1, 16 15651; RV32IA-TSO-NEXT: sll a3, a3, a0 15652; RV32IA-TSO-NEXT: sll a1, a1, a0 15653; RV32IA-TSO-NEXT: sub a4, a4, a5 15654; RV32IA-TSO-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1 15655; RV32IA-TSO-NEXT: lr.w a5, (a2) 15656; RV32IA-TSO-NEXT: and a7, a5, a3 15657; RV32IA-TSO-NEXT: mv a6, a5 15658; RV32IA-TSO-NEXT: sll a7, a7, a4 15659; RV32IA-TSO-NEXT: sra a7, a7, a4 15660; RV32IA-TSO-NEXT: bge a7, a1, .LBB111_3 15661; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1 15662; RV32IA-TSO-NEXT: xor a6, a5, a1 15663; RV32IA-TSO-NEXT: and a6, a6, a3 15664; RV32IA-TSO-NEXT: xor a6, a5, a6 15665; RV32IA-TSO-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1 15666; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 15667; RV32IA-TSO-NEXT: bnez a6, .LBB111_1 15668; RV32IA-TSO-NEXT: # %bb.4: 15669; RV32IA-TSO-NEXT: srl a0, a5, a0 15670; RV32IA-TSO-NEXT: ret 15671; 15672; RV64I-LABEL: atomicrmw_max_i16_acquire: 15673; RV64I: # %bb.0: 15674; RV64I-NEXT: addi sp, sp, -48 15675; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 15676; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 15677; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 15678; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 15679; RV64I-NEXT: mv s0, a0 15680; RV64I-NEXT: lhu a3, 0(a0) 15681; RV64I-NEXT: mv s1, a1 15682; RV64I-NEXT: slli a0, a1, 48 15683; RV64I-NEXT: srai s2, a0, 48 15684; RV64I-NEXT: j .LBB111_2 15685; RV64I-NEXT: .LBB111_1: # %atomicrmw.start 15686; RV64I-NEXT: # in Loop: Header=BB111_2 Depth=1 15687; RV64I-NEXT: sh a3, 14(sp) 15688; RV64I-NEXT: addi a1, sp, 14 15689; RV64I-NEXT: li a3, 2 15690; RV64I-NEXT: li a4, 2 15691; RV64I-NEXT: mv a0, s0 15692; RV64I-NEXT: call __atomic_compare_exchange_2 15693; RV64I-NEXT: lh a3, 14(sp) 15694; RV64I-NEXT: bnez a0, .LBB111_4 15695; RV64I-NEXT: .LBB111_2: # %atomicrmw.start 15696; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15697; RV64I-NEXT: slli a0, a3, 48 15698; RV64I-NEXT: srai a0, a0, 48 15699; RV64I-NEXT: mv a2, a3 15700; RV64I-NEXT: blt s2, a0, .LBB111_1 15701; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15702; RV64I-NEXT: # in Loop: Header=BB111_2 Depth=1 15703; RV64I-NEXT: mv a2, s1 15704; RV64I-NEXT: j .LBB111_1 15705; RV64I-NEXT: .LBB111_4: # %atomicrmw.end 15706; RV64I-NEXT: mv a0, a3 15707; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 15708; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 15709; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 15710; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 15711; RV64I-NEXT: addi sp, sp, 48 15712; RV64I-NEXT: ret 15713; 15714; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_acquire: 15715; RV64IA-WMO-NOZACAS: # %bb.0: 15716; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 15717; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 15718; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 15719; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 15720; RV64IA-WMO-NOZACAS-NEXT: li a4, 48 15721; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24 15722; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 15723; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48 15724; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 15725; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 15726; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5 15727; RV64IA-WMO-NOZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1 15728; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 15729; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 15730; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 15731; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 15732; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 15733; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB111_3 15734; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1 15735; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 15736; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 15737; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 15738; RV64IA-WMO-NOZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1 15739; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2) 15740; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB111_1 15741; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 15742; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 15743; RV64IA-WMO-NOZACAS-NEXT: ret 15744; 15745; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_acquire: 15746; RV64IA-TSO-NOZACAS: # %bb.0: 15747; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 15748; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 15749; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 15750; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 15751; RV64IA-TSO-NOZACAS-NEXT: li a4, 48 15752; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24 15753; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 15754; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48 15755; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 15756; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 15757; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5 15758; RV64IA-TSO-NOZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1 15759; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 15760; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 15761; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 15762; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 15763; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 15764; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB111_3 15765; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1 15766; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 15767; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 15768; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 15769; RV64IA-TSO-NOZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1 15770; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 15771; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB111_1 15772; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 15773; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 15774; RV64IA-TSO-NOZACAS-NEXT: ret 15775; 15776; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_acquire: 15777; RV64IA-WMO-ZACAS: # %bb.0: 15778; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 15779; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 15780; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 15781; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 15782; RV64IA-WMO-ZACAS-NEXT: li a4, 48 15783; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24 15784; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 15785; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48 15786; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 15787; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 15788; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5 15789; RV64IA-WMO-ZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1 15790; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 15791; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 15792; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 15793; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 15794; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 15795; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB111_3 15796; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1 15797; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 15798; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 15799; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 15800; RV64IA-WMO-ZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1 15801; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2) 15802; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB111_1 15803; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 15804; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 15805; RV64IA-WMO-ZACAS-NEXT: ret 15806; 15807; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_acquire: 15808; RV64IA-TSO-ZACAS: # %bb.0: 15809; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 15810; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 15811; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 15812; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 15813; RV64IA-TSO-ZACAS-NEXT: li a4, 48 15814; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24 15815; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 15816; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48 15817; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 15818; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 15819; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5 15820; RV64IA-TSO-ZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1 15821; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 15822; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 15823; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 15824; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 15825; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 15826; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB111_3 15827; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1 15828; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 15829; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 15830; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 15831; RV64IA-TSO-ZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1 15832; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 15833; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB111_1 15834; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 15835; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 15836; RV64IA-TSO-ZACAS-NEXT: ret 15837; 15838; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_acquire: 15839; RV64IA-WMO-ZABHA: # %bb.0: 15840; RV64IA-WMO-ZABHA-NEXT: amomax.h.aq a0, a1, (a0) 15841; RV64IA-WMO-ZABHA-NEXT: ret 15842; 15843; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_acquire: 15844; RV64IA-TSO-ZABHA: # %bb.0: 15845; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0) 15846; RV64IA-TSO-ZABHA-NEXT: ret 15847 %1 = atomicrmw max ptr %a, i16 %b acquire 15848 ret i16 %1 15849} 15850 15851define i16 @atomicrmw_max_i16_release(ptr %a, i16 %b) nounwind { 15852; RV32I-LABEL: atomicrmw_max_i16_release: 15853; RV32I: # %bb.0: 15854; RV32I-NEXT: addi sp, sp, -32 15855; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15856; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 15857; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 15858; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 15859; RV32I-NEXT: mv s0, a0 15860; RV32I-NEXT: lhu a3, 0(a0) 15861; RV32I-NEXT: mv s1, a1 15862; RV32I-NEXT: slli a0, a1, 16 15863; RV32I-NEXT: srai s2, a0, 16 15864; RV32I-NEXT: j .LBB112_2 15865; RV32I-NEXT: .LBB112_1: # %atomicrmw.start 15866; RV32I-NEXT: # in Loop: Header=BB112_2 Depth=1 15867; RV32I-NEXT: sh a3, 14(sp) 15868; RV32I-NEXT: addi a1, sp, 14 15869; RV32I-NEXT: li a3, 3 15870; RV32I-NEXT: mv a0, s0 15871; RV32I-NEXT: li a4, 0 15872; RV32I-NEXT: call __atomic_compare_exchange_2 15873; RV32I-NEXT: lh a3, 14(sp) 15874; RV32I-NEXT: bnez a0, .LBB112_4 15875; RV32I-NEXT: .LBB112_2: # %atomicrmw.start 15876; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 15877; RV32I-NEXT: slli a0, a3, 16 15878; RV32I-NEXT: srai a0, a0, 16 15879; RV32I-NEXT: mv a2, a3 15880; RV32I-NEXT: blt s2, a0, .LBB112_1 15881; RV32I-NEXT: # %bb.3: # %atomicrmw.start 15882; RV32I-NEXT: # in Loop: Header=BB112_2 Depth=1 15883; RV32I-NEXT: mv a2, s1 15884; RV32I-NEXT: j .LBB112_1 15885; RV32I-NEXT: .LBB112_4: # %atomicrmw.end 15886; RV32I-NEXT: mv a0, a3 15887; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 15888; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 15889; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 15890; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 15891; RV32I-NEXT: addi sp, sp, 32 15892; RV32I-NEXT: ret 15893; 15894; RV32IA-WMO-LABEL: atomicrmw_max_i16_release: 15895; RV32IA-WMO: # %bb.0: 15896; RV32IA-WMO-NEXT: andi a2, a0, -4 15897; RV32IA-WMO-NEXT: slli a0, a0, 3 15898; RV32IA-WMO-NEXT: lui a3, 16 15899; RV32IA-WMO-NEXT: slli a1, a1, 16 15900; RV32IA-WMO-NEXT: li a4, 16 15901; RV32IA-WMO-NEXT: andi a5, a0, 24 15902; RV32IA-WMO-NEXT: addi a3, a3, -1 15903; RV32IA-WMO-NEXT: srai a1, a1, 16 15904; RV32IA-WMO-NEXT: sll a3, a3, a0 15905; RV32IA-WMO-NEXT: sll a1, a1, a0 15906; RV32IA-WMO-NEXT: sub a4, a4, a5 15907; RV32IA-WMO-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1 15908; RV32IA-WMO-NEXT: lr.w a5, (a2) 15909; RV32IA-WMO-NEXT: and a7, a5, a3 15910; RV32IA-WMO-NEXT: mv a6, a5 15911; RV32IA-WMO-NEXT: sll a7, a7, a4 15912; RV32IA-WMO-NEXT: sra a7, a7, a4 15913; RV32IA-WMO-NEXT: bge a7, a1, .LBB112_3 15914; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1 15915; RV32IA-WMO-NEXT: xor a6, a5, a1 15916; RV32IA-WMO-NEXT: and a6, a6, a3 15917; RV32IA-WMO-NEXT: xor a6, a5, a6 15918; RV32IA-WMO-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1 15919; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 15920; RV32IA-WMO-NEXT: bnez a6, .LBB112_1 15921; RV32IA-WMO-NEXT: # %bb.4: 15922; RV32IA-WMO-NEXT: srl a0, a5, a0 15923; RV32IA-WMO-NEXT: ret 15924; 15925; RV32IA-TSO-LABEL: atomicrmw_max_i16_release: 15926; RV32IA-TSO: # %bb.0: 15927; RV32IA-TSO-NEXT: andi a2, a0, -4 15928; RV32IA-TSO-NEXT: slli a0, a0, 3 15929; RV32IA-TSO-NEXT: lui a3, 16 15930; RV32IA-TSO-NEXT: slli a1, a1, 16 15931; RV32IA-TSO-NEXT: li a4, 16 15932; RV32IA-TSO-NEXT: andi a5, a0, 24 15933; RV32IA-TSO-NEXT: addi a3, a3, -1 15934; RV32IA-TSO-NEXT: srai a1, a1, 16 15935; RV32IA-TSO-NEXT: sll a3, a3, a0 15936; RV32IA-TSO-NEXT: sll a1, a1, a0 15937; RV32IA-TSO-NEXT: sub a4, a4, a5 15938; RV32IA-TSO-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1 15939; RV32IA-TSO-NEXT: lr.w a5, (a2) 15940; RV32IA-TSO-NEXT: and a7, a5, a3 15941; RV32IA-TSO-NEXT: mv a6, a5 15942; RV32IA-TSO-NEXT: sll a7, a7, a4 15943; RV32IA-TSO-NEXT: sra a7, a7, a4 15944; RV32IA-TSO-NEXT: bge a7, a1, .LBB112_3 15945; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1 15946; RV32IA-TSO-NEXT: xor a6, a5, a1 15947; RV32IA-TSO-NEXT: and a6, a6, a3 15948; RV32IA-TSO-NEXT: xor a6, a5, a6 15949; RV32IA-TSO-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1 15950; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 15951; RV32IA-TSO-NEXT: bnez a6, .LBB112_1 15952; RV32IA-TSO-NEXT: # %bb.4: 15953; RV32IA-TSO-NEXT: srl a0, a5, a0 15954; RV32IA-TSO-NEXT: ret 15955; 15956; RV64I-LABEL: atomicrmw_max_i16_release: 15957; RV64I: # %bb.0: 15958; RV64I-NEXT: addi sp, sp, -48 15959; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 15960; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 15961; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 15962; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 15963; RV64I-NEXT: mv s0, a0 15964; RV64I-NEXT: lhu a3, 0(a0) 15965; RV64I-NEXT: mv s1, a1 15966; RV64I-NEXT: slli a0, a1, 48 15967; RV64I-NEXT: srai s2, a0, 48 15968; RV64I-NEXT: j .LBB112_2 15969; RV64I-NEXT: .LBB112_1: # %atomicrmw.start 15970; RV64I-NEXT: # in Loop: Header=BB112_2 Depth=1 15971; RV64I-NEXT: sh a3, 14(sp) 15972; RV64I-NEXT: addi a1, sp, 14 15973; RV64I-NEXT: li a3, 3 15974; RV64I-NEXT: mv a0, s0 15975; RV64I-NEXT: li a4, 0 15976; RV64I-NEXT: call __atomic_compare_exchange_2 15977; RV64I-NEXT: lh a3, 14(sp) 15978; RV64I-NEXT: bnez a0, .LBB112_4 15979; RV64I-NEXT: .LBB112_2: # %atomicrmw.start 15980; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 15981; RV64I-NEXT: slli a0, a3, 48 15982; RV64I-NEXT: srai a0, a0, 48 15983; RV64I-NEXT: mv a2, a3 15984; RV64I-NEXT: blt s2, a0, .LBB112_1 15985; RV64I-NEXT: # %bb.3: # %atomicrmw.start 15986; RV64I-NEXT: # in Loop: Header=BB112_2 Depth=1 15987; RV64I-NEXT: mv a2, s1 15988; RV64I-NEXT: j .LBB112_1 15989; RV64I-NEXT: .LBB112_4: # %atomicrmw.end 15990; RV64I-NEXT: mv a0, a3 15991; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 15992; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 15993; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 15994; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 15995; RV64I-NEXT: addi sp, sp, 48 15996; RV64I-NEXT: ret 15997; 15998; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_release: 15999; RV64IA-WMO-NOZACAS: # %bb.0: 16000; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 16001; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 16002; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 16003; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 16004; RV64IA-WMO-NOZACAS-NEXT: li a4, 48 16005; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24 16006; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 16007; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48 16008; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 16009; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 16010; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5 16011; RV64IA-WMO-NOZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1 16012; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2) 16013; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 16014; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 16015; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 16016; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 16017; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB112_3 16018; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1 16019; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 16020; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 16021; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 16022; RV64IA-WMO-NOZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1 16023; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 16024; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB112_1 16025; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 16026; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 16027; RV64IA-WMO-NOZACAS-NEXT: ret 16028; 16029; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_release: 16030; RV64IA-TSO-NOZACAS: # %bb.0: 16031; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 16032; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 16033; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 16034; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 16035; RV64IA-TSO-NOZACAS-NEXT: li a4, 48 16036; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24 16037; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 16038; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48 16039; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 16040; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 16041; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5 16042; RV64IA-TSO-NOZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1 16043; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 16044; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 16045; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 16046; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 16047; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 16048; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB112_3 16049; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1 16050; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 16051; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 16052; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 16053; RV64IA-TSO-NOZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1 16054; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 16055; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB112_1 16056; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 16057; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 16058; RV64IA-TSO-NOZACAS-NEXT: ret 16059; 16060; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_release: 16061; RV64IA-WMO-ZACAS: # %bb.0: 16062; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 16063; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 16064; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 16065; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 16066; RV64IA-WMO-ZACAS-NEXT: li a4, 48 16067; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24 16068; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 16069; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48 16070; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 16071; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 16072; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5 16073; RV64IA-WMO-ZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1 16074; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2) 16075; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 16076; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 16077; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 16078; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 16079; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB112_3 16080; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1 16081; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 16082; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 16083; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 16084; RV64IA-WMO-ZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1 16085; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 16086; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB112_1 16087; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 16088; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 16089; RV64IA-WMO-ZACAS-NEXT: ret 16090; 16091; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_release: 16092; RV64IA-TSO-ZACAS: # %bb.0: 16093; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 16094; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 16095; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 16096; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 16097; RV64IA-TSO-ZACAS-NEXT: li a4, 48 16098; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24 16099; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 16100; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48 16101; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 16102; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 16103; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5 16104; RV64IA-TSO-ZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1 16105; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 16106; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 16107; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 16108; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 16109; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 16110; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB112_3 16111; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1 16112; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 16113; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 16114; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 16115; RV64IA-TSO-ZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1 16116; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 16117; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB112_1 16118; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 16119; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 16120; RV64IA-TSO-ZACAS-NEXT: ret 16121; 16122; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_release: 16123; RV64IA-WMO-ZABHA: # %bb.0: 16124; RV64IA-WMO-ZABHA-NEXT: amomax.h.rl a0, a1, (a0) 16125; RV64IA-WMO-ZABHA-NEXT: ret 16126; 16127; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_release: 16128; RV64IA-TSO-ZABHA: # %bb.0: 16129; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0) 16130; RV64IA-TSO-ZABHA-NEXT: ret 16131 %1 = atomicrmw max ptr %a, i16 %b release 16132 ret i16 %1 16133} 16134 16135define i16 @atomicrmw_max_i16_acq_rel(ptr %a, i16 %b) nounwind { 16136; RV32I-LABEL: atomicrmw_max_i16_acq_rel: 16137; RV32I: # %bb.0: 16138; RV32I-NEXT: addi sp, sp, -32 16139; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16140; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16141; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16142; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16143; RV32I-NEXT: mv s0, a0 16144; RV32I-NEXT: lhu a3, 0(a0) 16145; RV32I-NEXT: mv s1, a1 16146; RV32I-NEXT: slli a0, a1, 16 16147; RV32I-NEXT: srai s2, a0, 16 16148; RV32I-NEXT: j .LBB113_2 16149; RV32I-NEXT: .LBB113_1: # %atomicrmw.start 16150; RV32I-NEXT: # in Loop: Header=BB113_2 Depth=1 16151; RV32I-NEXT: sh a3, 14(sp) 16152; RV32I-NEXT: addi a1, sp, 14 16153; RV32I-NEXT: li a3, 4 16154; RV32I-NEXT: li a4, 2 16155; RV32I-NEXT: mv a0, s0 16156; RV32I-NEXT: call __atomic_compare_exchange_2 16157; RV32I-NEXT: lh a3, 14(sp) 16158; RV32I-NEXT: bnez a0, .LBB113_4 16159; RV32I-NEXT: .LBB113_2: # %atomicrmw.start 16160; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16161; RV32I-NEXT: slli a0, a3, 16 16162; RV32I-NEXT: srai a0, a0, 16 16163; RV32I-NEXT: mv a2, a3 16164; RV32I-NEXT: blt s2, a0, .LBB113_1 16165; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16166; RV32I-NEXT: # in Loop: Header=BB113_2 Depth=1 16167; RV32I-NEXT: mv a2, s1 16168; RV32I-NEXT: j .LBB113_1 16169; RV32I-NEXT: .LBB113_4: # %atomicrmw.end 16170; RV32I-NEXT: mv a0, a3 16171; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16172; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16173; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16174; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16175; RV32I-NEXT: addi sp, sp, 32 16176; RV32I-NEXT: ret 16177; 16178; RV32IA-WMO-LABEL: atomicrmw_max_i16_acq_rel: 16179; RV32IA-WMO: # %bb.0: 16180; RV32IA-WMO-NEXT: andi a2, a0, -4 16181; RV32IA-WMO-NEXT: slli a0, a0, 3 16182; RV32IA-WMO-NEXT: lui a3, 16 16183; RV32IA-WMO-NEXT: slli a1, a1, 16 16184; RV32IA-WMO-NEXT: li a4, 16 16185; RV32IA-WMO-NEXT: andi a5, a0, 24 16186; RV32IA-WMO-NEXT: addi a3, a3, -1 16187; RV32IA-WMO-NEXT: srai a1, a1, 16 16188; RV32IA-WMO-NEXT: sll a3, a3, a0 16189; RV32IA-WMO-NEXT: sll a1, a1, a0 16190; RV32IA-WMO-NEXT: sub a4, a4, a5 16191; RV32IA-WMO-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1 16192; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 16193; RV32IA-WMO-NEXT: and a7, a5, a3 16194; RV32IA-WMO-NEXT: mv a6, a5 16195; RV32IA-WMO-NEXT: sll a7, a7, a4 16196; RV32IA-WMO-NEXT: sra a7, a7, a4 16197; RV32IA-WMO-NEXT: bge a7, a1, .LBB113_3 16198; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1 16199; RV32IA-WMO-NEXT: xor a6, a5, a1 16200; RV32IA-WMO-NEXT: and a6, a6, a3 16201; RV32IA-WMO-NEXT: xor a6, a5, a6 16202; RV32IA-WMO-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1 16203; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 16204; RV32IA-WMO-NEXT: bnez a6, .LBB113_1 16205; RV32IA-WMO-NEXT: # %bb.4: 16206; RV32IA-WMO-NEXT: srl a0, a5, a0 16207; RV32IA-WMO-NEXT: ret 16208; 16209; RV32IA-TSO-LABEL: atomicrmw_max_i16_acq_rel: 16210; RV32IA-TSO: # %bb.0: 16211; RV32IA-TSO-NEXT: andi a2, a0, -4 16212; RV32IA-TSO-NEXT: slli a0, a0, 3 16213; RV32IA-TSO-NEXT: lui a3, 16 16214; RV32IA-TSO-NEXT: slli a1, a1, 16 16215; RV32IA-TSO-NEXT: li a4, 16 16216; RV32IA-TSO-NEXT: andi a5, a0, 24 16217; RV32IA-TSO-NEXT: addi a3, a3, -1 16218; RV32IA-TSO-NEXT: srai a1, a1, 16 16219; RV32IA-TSO-NEXT: sll a3, a3, a0 16220; RV32IA-TSO-NEXT: sll a1, a1, a0 16221; RV32IA-TSO-NEXT: sub a4, a4, a5 16222; RV32IA-TSO-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1 16223; RV32IA-TSO-NEXT: lr.w a5, (a2) 16224; RV32IA-TSO-NEXT: and a7, a5, a3 16225; RV32IA-TSO-NEXT: mv a6, a5 16226; RV32IA-TSO-NEXT: sll a7, a7, a4 16227; RV32IA-TSO-NEXT: sra a7, a7, a4 16228; RV32IA-TSO-NEXT: bge a7, a1, .LBB113_3 16229; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1 16230; RV32IA-TSO-NEXT: xor a6, a5, a1 16231; RV32IA-TSO-NEXT: and a6, a6, a3 16232; RV32IA-TSO-NEXT: xor a6, a5, a6 16233; RV32IA-TSO-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1 16234; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 16235; RV32IA-TSO-NEXT: bnez a6, .LBB113_1 16236; RV32IA-TSO-NEXT: # %bb.4: 16237; RV32IA-TSO-NEXT: srl a0, a5, a0 16238; RV32IA-TSO-NEXT: ret 16239; 16240; RV64I-LABEL: atomicrmw_max_i16_acq_rel: 16241; RV64I: # %bb.0: 16242; RV64I-NEXT: addi sp, sp, -48 16243; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 16244; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 16245; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 16246; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 16247; RV64I-NEXT: mv s0, a0 16248; RV64I-NEXT: lhu a3, 0(a0) 16249; RV64I-NEXT: mv s1, a1 16250; RV64I-NEXT: slli a0, a1, 48 16251; RV64I-NEXT: srai s2, a0, 48 16252; RV64I-NEXT: j .LBB113_2 16253; RV64I-NEXT: .LBB113_1: # %atomicrmw.start 16254; RV64I-NEXT: # in Loop: Header=BB113_2 Depth=1 16255; RV64I-NEXT: sh a3, 14(sp) 16256; RV64I-NEXT: addi a1, sp, 14 16257; RV64I-NEXT: li a3, 4 16258; RV64I-NEXT: li a4, 2 16259; RV64I-NEXT: mv a0, s0 16260; RV64I-NEXT: call __atomic_compare_exchange_2 16261; RV64I-NEXT: lh a3, 14(sp) 16262; RV64I-NEXT: bnez a0, .LBB113_4 16263; RV64I-NEXT: .LBB113_2: # %atomicrmw.start 16264; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16265; RV64I-NEXT: slli a0, a3, 48 16266; RV64I-NEXT: srai a0, a0, 48 16267; RV64I-NEXT: mv a2, a3 16268; RV64I-NEXT: blt s2, a0, .LBB113_1 16269; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16270; RV64I-NEXT: # in Loop: Header=BB113_2 Depth=1 16271; RV64I-NEXT: mv a2, s1 16272; RV64I-NEXT: j .LBB113_1 16273; RV64I-NEXT: .LBB113_4: # %atomicrmw.end 16274; RV64I-NEXT: mv a0, a3 16275; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 16276; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 16277; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 16278; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 16279; RV64I-NEXT: addi sp, sp, 48 16280; RV64I-NEXT: ret 16281; 16282; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_acq_rel: 16283; RV64IA-WMO-NOZACAS: # %bb.0: 16284; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 16285; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 16286; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 16287; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 16288; RV64IA-WMO-NOZACAS-NEXT: li a4, 48 16289; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24 16290; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 16291; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48 16292; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 16293; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 16294; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5 16295; RV64IA-WMO-NOZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1 16296; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 16297; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 16298; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 16299; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 16300; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 16301; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB113_3 16302; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1 16303; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 16304; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 16305; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 16306; RV64IA-WMO-NOZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1 16307; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 16308; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB113_1 16309; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 16310; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 16311; RV64IA-WMO-NOZACAS-NEXT: ret 16312; 16313; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_acq_rel: 16314; RV64IA-TSO-NOZACAS: # %bb.0: 16315; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 16316; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 16317; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 16318; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 16319; RV64IA-TSO-NOZACAS-NEXT: li a4, 48 16320; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24 16321; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 16322; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48 16323; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 16324; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 16325; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5 16326; RV64IA-TSO-NOZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1 16327; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 16328; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 16329; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 16330; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 16331; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 16332; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB113_3 16333; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1 16334; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 16335; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 16336; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 16337; RV64IA-TSO-NOZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1 16338; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 16339; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB113_1 16340; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 16341; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 16342; RV64IA-TSO-NOZACAS-NEXT: ret 16343; 16344; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_acq_rel: 16345; RV64IA-WMO-ZACAS: # %bb.0: 16346; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 16347; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 16348; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 16349; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 16350; RV64IA-WMO-ZACAS-NEXT: li a4, 48 16351; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24 16352; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 16353; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48 16354; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 16355; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 16356; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5 16357; RV64IA-WMO-ZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1 16358; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 16359; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 16360; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 16361; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 16362; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 16363; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB113_3 16364; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1 16365; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 16366; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 16367; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 16368; RV64IA-WMO-ZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1 16369; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 16370; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB113_1 16371; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 16372; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 16373; RV64IA-WMO-ZACAS-NEXT: ret 16374; 16375; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_acq_rel: 16376; RV64IA-TSO-ZACAS: # %bb.0: 16377; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 16378; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 16379; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 16380; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 16381; RV64IA-TSO-ZACAS-NEXT: li a4, 48 16382; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24 16383; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 16384; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48 16385; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 16386; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 16387; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5 16388; RV64IA-TSO-ZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1 16389; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 16390; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 16391; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 16392; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 16393; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 16394; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB113_3 16395; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1 16396; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 16397; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 16398; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 16399; RV64IA-TSO-ZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1 16400; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 16401; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB113_1 16402; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 16403; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 16404; RV64IA-TSO-ZACAS-NEXT: ret 16405; 16406; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_acq_rel: 16407; RV64IA-WMO-ZABHA: # %bb.0: 16408; RV64IA-WMO-ZABHA-NEXT: amomax.h.aqrl a0, a1, (a0) 16409; RV64IA-WMO-ZABHA-NEXT: ret 16410; 16411; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_acq_rel: 16412; RV64IA-TSO-ZABHA: # %bb.0: 16413; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0) 16414; RV64IA-TSO-ZABHA-NEXT: ret 16415 %1 = atomicrmw max ptr %a, i16 %b acq_rel 16416 ret i16 %1 16417} 16418 16419define i16 @atomicrmw_max_i16_seq_cst(ptr %a, i16 %b) nounwind { 16420; RV32I-LABEL: atomicrmw_max_i16_seq_cst: 16421; RV32I: # %bb.0: 16422; RV32I-NEXT: addi sp, sp, -32 16423; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16424; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16425; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16426; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16427; RV32I-NEXT: mv s0, a0 16428; RV32I-NEXT: lhu a3, 0(a0) 16429; RV32I-NEXT: mv s1, a1 16430; RV32I-NEXT: slli a0, a1, 16 16431; RV32I-NEXT: srai s2, a0, 16 16432; RV32I-NEXT: j .LBB114_2 16433; RV32I-NEXT: .LBB114_1: # %atomicrmw.start 16434; RV32I-NEXT: # in Loop: Header=BB114_2 Depth=1 16435; RV32I-NEXT: sh a3, 14(sp) 16436; RV32I-NEXT: addi a1, sp, 14 16437; RV32I-NEXT: li a3, 5 16438; RV32I-NEXT: li a4, 5 16439; RV32I-NEXT: mv a0, s0 16440; RV32I-NEXT: call __atomic_compare_exchange_2 16441; RV32I-NEXT: lh a3, 14(sp) 16442; RV32I-NEXT: bnez a0, .LBB114_4 16443; RV32I-NEXT: .LBB114_2: # %atomicrmw.start 16444; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16445; RV32I-NEXT: slli a0, a3, 16 16446; RV32I-NEXT: srai a0, a0, 16 16447; RV32I-NEXT: mv a2, a3 16448; RV32I-NEXT: blt s2, a0, .LBB114_1 16449; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16450; RV32I-NEXT: # in Loop: Header=BB114_2 Depth=1 16451; RV32I-NEXT: mv a2, s1 16452; RV32I-NEXT: j .LBB114_1 16453; RV32I-NEXT: .LBB114_4: # %atomicrmw.end 16454; RV32I-NEXT: mv a0, a3 16455; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16456; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16457; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16458; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16459; RV32I-NEXT: addi sp, sp, 32 16460; RV32I-NEXT: ret 16461; 16462; RV32IA-LABEL: atomicrmw_max_i16_seq_cst: 16463; RV32IA: # %bb.0: 16464; RV32IA-NEXT: andi a2, a0, -4 16465; RV32IA-NEXT: slli a0, a0, 3 16466; RV32IA-NEXT: lui a3, 16 16467; RV32IA-NEXT: slli a1, a1, 16 16468; RV32IA-NEXT: li a4, 16 16469; RV32IA-NEXT: andi a5, a0, 24 16470; RV32IA-NEXT: addi a3, a3, -1 16471; RV32IA-NEXT: srai a1, a1, 16 16472; RV32IA-NEXT: sll a3, a3, a0 16473; RV32IA-NEXT: sll a1, a1, a0 16474; RV32IA-NEXT: sub a4, a4, a5 16475; RV32IA-NEXT: .LBB114_1: # =>This Inner Loop Header: Depth=1 16476; RV32IA-NEXT: lr.w.aqrl a5, (a2) 16477; RV32IA-NEXT: and a7, a5, a3 16478; RV32IA-NEXT: mv a6, a5 16479; RV32IA-NEXT: sll a7, a7, a4 16480; RV32IA-NEXT: sra a7, a7, a4 16481; RV32IA-NEXT: bge a7, a1, .LBB114_3 16482; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB114_1 Depth=1 16483; RV32IA-NEXT: xor a6, a5, a1 16484; RV32IA-NEXT: and a6, a6, a3 16485; RV32IA-NEXT: xor a6, a5, a6 16486; RV32IA-NEXT: .LBB114_3: # in Loop: Header=BB114_1 Depth=1 16487; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 16488; RV32IA-NEXT: bnez a6, .LBB114_1 16489; RV32IA-NEXT: # %bb.4: 16490; RV32IA-NEXT: srl a0, a5, a0 16491; RV32IA-NEXT: ret 16492; 16493; RV64I-LABEL: atomicrmw_max_i16_seq_cst: 16494; RV64I: # %bb.0: 16495; RV64I-NEXT: addi sp, sp, -48 16496; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 16497; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 16498; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 16499; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 16500; RV64I-NEXT: mv s0, a0 16501; RV64I-NEXT: lhu a3, 0(a0) 16502; RV64I-NEXT: mv s1, a1 16503; RV64I-NEXT: slli a0, a1, 48 16504; RV64I-NEXT: srai s2, a0, 48 16505; RV64I-NEXT: j .LBB114_2 16506; RV64I-NEXT: .LBB114_1: # %atomicrmw.start 16507; RV64I-NEXT: # in Loop: Header=BB114_2 Depth=1 16508; RV64I-NEXT: sh a3, 14(sp) 16509; RV64I-NEXT: addi a1, sp, 14 16510; RV64I-NEXT: li a3, 5 16511; RV64I-NEXT: li a4, 5 16512; RV64I-NEXT: mv a0, s0 16513; RV64I-NEXT: call __atomic_compare_exchange_2 16514; RV64I-NEXT: lh a3, 14(sp) 16515; RV64I-NEXT: bnez a0, .LBB114_4 16516; RV64I-NEXT: .LBB114_2: # %atomicrmw.start 16517; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16518; RV64I-NEXT: slli a0, a3, 48 16519; RV64I-NEXT: srai a0, a0, 48 16520; RV64I-NEXT: mv a2, a3 16521; RV64I-NEXT: blt s2, a0, .LBB114_1 16522; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16523; RV64I-NEXT: # in Loop: Header=BB114_2 Depth=1 16524; RV64I-NEXT: mv a2, s1 16525; RV64I-NEXT: j .LBB114_1 16526; RV64I-NEXT: .LBB114_4: # %atomicrmw.end 16527; RV64I-NEXT: mv a0, a3 16528; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 16529; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 16530; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 16531; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 16532; RV64I-NEXT: addi sp, sp, 48 16533; RV64I-NEXT: ret 16534; 16535; RV64IA-NOZACAS-LABEL: atomicrmw_max_i16_seq_cst: 16536; RV64IA-NOZACAS: # %bb.0: 16537; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 16538; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 16539; RV64IA-NOZACAS-NEXT: lui a3, 16 16540; RV64IA-NOZACAS-NEXT: slli a1, a1, 48 16541; RV64IA-NOZACAS-NEXT: li a4, 48 16542; RV64IA-NOZACAS-NEXT: andi a5, a0, 24 16543; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 16544; RV64IA-NOZACAS-NEXT: srai a1, a1, 48 16545; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 16546; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 16547; RV64IA-NOZACAS-NEXT: sub a4, a4, a5 16548; RV64IA-NOZACAS-NEXT: .LBB114_1: # =>This Inner Loop Header: Depth=1 16549; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2) 16550; RV64IA-NOZACAS-NEXT: and a7, a5, a3 16551; RV64IA-NOZACAS-NEXT: mv a6, a5 16552; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 16553; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 16554; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB114_3 16555; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB114_1 Depth=1 16556; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 16557; RV64IA-NOZACAS-NEXT: and a6, a6, a3 16558; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 16559; RV64IA-NOZACAS-NEXT: .LBB114_3: # in Loop: Header=BB114_1 Depth=1 16560; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 16561; RV64IA-NOZACAS-NEXT: bnez a6, .LBB114_1 16562; RV64IA-NOZACAS-NEXT: # %bb.4: 16563; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 16564; RV64IA-NOZACAS-NEXT: ret 16565; 16566; RV64IA-ZACAS-LABEL: atomicrmw_max_i16_seq_cst: 16567; RV64IA-ZACAS: # %bb.0: 16568; RV64IA-ZACAS-NEXT: andi a2, a0, -4 16569; RV64IA-ZACAS-NEXT: slli a0, a0, 3 16570; RV64IA-ZACAS-NEXT: lui a3, 16 16571; RV64IA-ZACAS-NEXT: slli a1, a1, 48 16572; RV64IA-ZACAS-NEXT: li a4, 48 16573; RV64IA-ZACAS-NEXT: andi a5, a0, 24 16574; RV64IA-ZACAS-NEXT: addi a3, a3, -1 16575; RV64IA-ZACAS-NEXT: srai a1, a1, 48 16576; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 16577; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 16578; RV64IA-ZACAS-NEXT: sub a4, a4, a5 16579; RV64IA-ZACAS-NEXT: .LBB114_1: # =>This Inner Loop Header: Depth=1 16580; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2) 16581; RV64IA-ZACAS-NEXT: and a7, a5, a3 16582; RV64IA-ZACAS-NEXT: mv a6, a5 16583; RV64IA-ZACAS-NEXT: sll a7, a7, a4 16584; RV64IA-ZACAS-NEXT: sra a7, a7, a4 16585; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB114_3 16586; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB114_1 Depth=1 16587; RV64IA-ZACAS-NEXT: xor a6, a5, a1 16588; RV64IA-ZACAS-NEXT: and a6, a6, a3 16589; RV64IA-ZACAS-NEXT: xor a6, a5, a6 16590; RV64IA-ZACAS-NEXT: .LBB114_3: # in Loop: Header=BB114_1 Depth=1 16591; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 16592; RV64IA-ZACAS-NEXT: bnez a6, .LBB114_1 16593; RV64IA-ZACAS-NEXT: # %bb.4: 16594; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 16595; RV64IA-ZACAS-NEXT: ret 16596; 16597; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_seq_cst: 16598; RV64IA-WMO-ZABHA: # %bb.0: 16599; RV64IA-WMO-ZABHA-NEXT: amomax.h.aqrl a0, a1, (a0) 16600; RV64IA-WMO-ZABHA-NEXT: ret 16601; 16602; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_seq_cst: 16603; RV64IA-TSO-ZABHA: # %bb.0: 16604; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0) 16605; RV64IA-TSO-ZABHA-NEXT: ret 16606 %1 = atomicrmw max ptr %a, i16 %b seq_cst 16607 ret i16 %1 16608} 16609 16610define i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind { 16611; RV32I-LABEL: atomicrmw_min_i16_monotonic: 16612; RV32I: # %bb.0: 16613; RV32I-NEXT: addi sp, sp, -32 16614; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16615; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16616; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16617; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16618; RV32I-NEXT: mv s0, a0 16619; RV32I-NEXT: lhu a3, 0(a0) 16620; RV32I-NEXT: mv s1, a1 16621; RV32I-NEXT: slli a0, a1, 16 16622; RV32I-NEXT: srai s2, a0, 16 16623; RV32I-NEXT: j .LBB115_2 16624; RV32I-NEXT: .LBB115_1: # %atomicrmw.start 16625; RV32I-NEXT: # in Loop: Header=BB115_2 Depth=1 16626; RV32I-NEXT: sh a3, 14(sp) 16627; RV32I-NEXT: addi a1, sp, 14 16628; RV32I-NEXT: mv a0, s0 16629; RV32I-NEXT: li a3, 0 16630; RV32I-NEXT: li a4, 0 16631; RV32I-NEXT: call __atomic_compare_exchange_2 16632; RV32I-NEXT: lh a3, 14(sp) 16633; RV32I-NEXT: bnez a0, .LBB115_4 16634; RV32I-NEXT: .LBB115_2: # %atomicrmw.start 16635; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16636; RV32I-NEXT: slli a0, a3, 16 16637; RV32I-NEXT: srai a0, a0, 16 16638; RV32I-NEXT: mv a2, a3 16639; RV32I-NEXT: bge s2, a0, .LBB115_1 16640; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16641; RV32I-NEXT: # in Loop: Header=BB115_2 Depth=1 16642; RV32I-NEXT: mv a2, s1 16643; RV32I-NEXT: j .LBB115_1 16644; RV32I-NEXT: .LBB115_4: # %atomicrmw.end 16645; RV32I-NEXT: mv a0, a3 16646; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16647; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16648; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16649; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16650; RV32I-NEXT: addi sp, sp, 32 16651; RV32I-NEXT: ret 16652; 16653; RV32IA-LABEL: atomicrmw_min_i16_monotonic: 16654; RV32IA: # %bb.0: 16655; RV32IA-NEXT: andi a2, a0, -4 16656; RV32IA-NEXT: slli a0, a0, 3 16657; RV32IA-NEXT: lui a3, 16 16658; RV32IA-NEXT: slli a1, a1, 16 16659; RV32IA-NEXT: li a4, 16 16660; RV32IA-NEXT: andi a5, a0, 24 16661; RV32IA-NEXT: addi a3, a3, -1 16662; RV32IA-NEXT: srai a1, a1, 16 16663; RV32IA-NEXT: sll a3, a3, a0 16664; RV32IA-NEXT: sll a1, a1, a0 16665; RV32IA-NEXT: sub a4, a4, a5 16666; RV32IA-NEXT: .LBB115_1: # =>This Inner Loop Header: Depth=1 16667; RV32IA-NEXT: lr.w a5, (a2) 16668; RV32IA-NEXT: and a7, a5, a3 16669; RV32IA-NEXT: mv a6, a5 16670; RV32IA-NEXT: sll a7, a7, a4 16671; RV32IA-NEXT: sra a7, a7, a4 16672; RV32IA-NEXT: bge a1, a7, .LBB115_3 16673; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB115_1 Depth=1 16674; RV32IA-NEXT: xor a6, a5, a1 16675; RV32IA-NEXT: and a6, a6, a3 16676; RV32IA-NEXT: xor a6, a5, a6 16677; RV32IA-NEXT: .LBB115_3: # in Loop: Header=BB115_1 Depth=1 16678; RV32IA-NEXT: sc.w a6, a6, (a2) 16679; RV32IA-NEXT: bnez a6, .LBB115_1 16680; RV32IA-NEXT: # %bb.4: 16681; RV32IA-NEXT: srl a0, a5, a0 16682; RV32IA-NEXT: ret 16683; 16684; RV64I-LABEL: atomicrmw_min_i16_monotonic: 16685; RV64I: # %bb.0: 16686; RV64I-NEXT: addi sp, sp, -48 16687; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 16688; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 16689; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 16690; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 16691; RV64I-NEXT: mv s0, a0 16692; RV64I-NEXT: lhu a3, 0(a0) 16693; RV64I-NEXT: mv s1, a1 16694; RV64I-NEXT: slli a0, a1, 48 16695; RV64I-NEXT: srai s2, a0, 48 16696; RV64I-NEXT: j .LBB115_2 16697; RV64I-NEXT: .LBB115_1: # %atomicrmw.start 16698; RV64I-NEXT: # in Loop: Header=BB115_2 Depth=1 16699; RV64I-NEXT: sh a3, 14(sp) 16700; RV64I-NEXT: addi a1, sp, 14 16701; RV64I-NEXT: mv a0, s0 16702; RV64I-NEXT: li a3, 0 16703; RV64I-NEXT: li a4, 0 16704; RV64I-NEXT: call __atomic_compare_exchange_2 16705; RV64I-NEXT: lh a3, 14(sp) 16706; RV64I-NEXT: bnez a0, .LBB115_4 16707; RV64I-NEXT: .LBB115_2: # %atomicrmw.start 16708; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16709; RV64I-NEXT: slli a0, a3, 48 16710; RV64I-NEXT: srai a0, a0, 48 16711; RV64I-NEXT: mv a2, a3 16712; RV64I-NEXT: bge s2, a0, .LBB115_1 16713; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16714; RV64I-NEXT: # in Loop: Header=BB115_2 Depth=1 16715; RV64I-NEXT: mv a2, s1 16716; RV64I-NEXT: j .LBB115_1 16717; RV64I-NEXT: .LBB115_4: # %atomicrmw.end 16718; RV64I-NEXT: mv a0, a3 16719; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 16720; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 16721; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 16722; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 16723; RV64I-NEXT: addi sp, sp, 48 16724; RV64I-NEXT: ret 16725; 16726; RV64IA-NOZACAS-LABEL: atomicrmw_min_i16_monotonic: 16727; RV64IA-NOZACAS: # %bb.0: 16728; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 16729; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 16730; RV64IA-NOZACAS-NEXT: lui a3, 16 16731; RV64IA-NOZACAS-NEXT: slli a1, a1, 48 16732; RV64IA-NOZACAS-NEXT: li a4, 48 16733; RV64IA-NOZACAS-NEXT: andi a5, a0, 24 16734; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 16735; RV64IA-NOZACAS-NEXT: srai a1, a1, 48 16736; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 16737; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 16738; RV64IA-NOZACAS-NEXT: sub a4, a4, a5 16739; RV64IA-NOZACAS-NEXT: .LBB115_1: # =>This Inner Loop Header: Depth=1 16740; RV64IA-NOZACAS-NEXT: lr.w a5, (a2) 16741; RV64IA-NOZACAS-NEXT: and a7, a5, a3 16742; RV64IA-NOZACAS-NEXT: mv a6, a5 16743; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 16744; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 16745; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB115_3 16746; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB115_1 Depth=1 16747; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 16748; RV64IA-NOZACAS-NEXT: and a6, a6, a3 16749; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 16750; RV64IA-NOZACAS-NEXT: .LBB115_3: # in Loop: Header=BB115_1 Depth=1 16751; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2) 16752; RV64IA-NOZACAS-NEXT: bnez a6, .LBB115_1 16753; RV64IA-NOZACAS-NEXT: # %bb.4: 16754; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 16755; RV64IA-NOZACAS-NEXT: ret 16756; 16757; RV64IA-ZACAS-LABEL: atomicrmw_min_i16_monotonic: 16758; RV64IA-ZACAS: # %bb.0: 16759; RV64IA-ZACAS-NEXT: andi a2, a0, -4 16760; RV64IA-ZACAS-NEXT: slli a0, a0, 3 16761; RV64IA-ZACAS-NEXT: lui a3, 16 16762; RV64IA-ZACAS-NEXT: slli a1, a1, 48 16763; RV64IA-ZACAS-NEXT: li a4, 48 16764; RV64IA-ZACAS-NEXT: andi a5, a0, 24 16765; RV64IA-ZACAS-NEXT: addi a3, a3, -1 16766; RV64IA-ZACAS-NEXT: srai a1, a1, 48 16767; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 16768; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 16769; RV64IA-ZACAS-NEXT: sub a4, a4, a5 16770; RV64IA-ZACAS-NEXT: .LBB115_1: # =>This Inner Loop Header: Depth=1 16771; RV64IA-ZACAS-NEXT: lr.w a5, (a2) 16772; RV64IA-ZACAS-NEXT: and a7, a5, a3 16773; RV64IA-ZACAS-NEXT: mv a6, a5 16774; RV64IA-ZACAS-NEXT: sll a7, a7, a4 16775; RV64IA-ZACAS-NEXT: sra a7, a7, a4 16776; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB115_3 16777; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB115_1 Depth=1 16778; RV64IA-ZACAS-NEXT: xor a6, a5, a1 16779; RV64IA-ZACAS-NEXT: and a6, a6, a3 16780; RV64IA-ZACAS-NEXT: xor a6, a5, a6 16781; RV64IA-ZACAS-NEXT: .LBB115_3: # in Loop: Header=BB115_1 Depth=1 16782; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2) 16783; RV64IA-ZACAS-NEXT: bnez a6, .LBB115_1 16784; RV64IA-ZACAS-NEXT: # %bb.4: 16785; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 16786; RV64IA-ZACAS-NEXT: ret 16787; 16788; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_monotonic: 16789; RV64IA-WMO-ZABHA: # %bb.0: 16790; RV64IA-WMO-ZABHA-NEXT: amomin.h a0, a1, (a0) 16791; RV64IA-WMO-ZABHA-NEXT: ret 16792; 16793; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_monotonic: 16794; RV64IA-TSO-ZABHA: # %bb.0: 16795; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0) 16796; RV64IA-TSO-ZABHA-NEXT: ret 16797 %1 = atomicrmw min ptr %a, i16 %b monotonic 16798 ret i16 %1 16799} 16800 16801define i16 @atomicrmw_min_i16_acquire(ptr %a, i16 %b) nounwind { 16802; RV32I-LABEL: atomicrmw_min_i16_acquire: 16803; RV32I: # %bb.0: 16804; RV32I-NEXT: addi sp, sp, -32 16805; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16806; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16807; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 16808; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 16809; RV32I-NEXT: mv s0, a0 16810; RV32I-NEXT: lhu a3, 0(a0) 16811; RV32I-NEXT: mv s1, a1 16812; RV32I-NEXT: slli a0, a1, 16 16813; RV32I-NEXT: srai s2, a0, 16 16814; RV32I-NEXT: j .LBB116_2 16815; RV32I-NEXT: .LBB116_1: # %atomicrmw.start 16816; RV32I-NEXT: # in Loop: Header=BB116_2 Depth=1 16817; RV32I-NEXT: sh a3, 14(sp) 16818; RV32I-NEXT: addi a1, sp, 14 16819; RV32I-NEXT: li a3, 2 16820; RV32I-NEXT: li a4, 2 16821; RV32I-NEXT: mv a0, s0 16822; RV32I-NEXT: call __atomic_compare_exchange_2 16823; RV32I-NEXT: lh a3, 14(sp) 16824; RV32I-NEXT: bnez a0, .LBB116_4 16825; RV32I-NEXT: .LBB116_2: # %atomicrmw.start 16826; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 16827; RV32I-NEXT: slli a0, a3, 16 16828; RV32I-NEXT: srai a0, a0, 16 16829; RV32I-NEXT: mv a2, a3 16830; RV32I-NEXT: bge s2, a0, .LBB116_1 16831; RV32I-NEXT: # %bb.3: # %atomicrmw.start 16832; RV32I-NEXT: # in Loop: Header=BB116_2 Depth=1 16833; RV32I-NEXT: mv a2, s1 16834; RV32I-NEXT: j .LBB116_1 16835; RV32I-NEXT: .LBB116_4: # %atomicrmw.end 16836; RV32I-NEXT: mv a0, a3 16837; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 16838; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 16839; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 16840; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 16841; RV32I-NEXT: addi sp, sp, 32 16842; RV32I-NEXT: ret 16843; 16844; RV32IA-WMO-LABEL: atomicrmw_min_i16_acquire: 16845; RV32IA-WMO: # %bb.0: 16846; RV32IA-WMO-NEXT: andi a2, a0, -4 16847; RV32IA-WMO-NEXT: slli a0, a0, 3 16848; RV32IA-WMO-NEXT: lui a3, 16 16849; RV32IA-WMO-NEXT: slli a1, a1, 16 16850; RV32IA-WMO-NEXT: li a4, 16 16851; RV32IA-WMO-NEXT: andi a5, a0, 24 16852; RV32IA-WMO-NEXT: addi a3, a3, -1 16853; RV32IA-WMO-NEXT: srai a1, a1, 16 16854; RV32IA-WMO-NEXT: sll a3, a3, a0 16855; RV32IA-WMO-NEXT: sll a1, a1, a0 16856; RV32IA-WMO-NEXT: sub a4, a4, a5 16857; RV32IA-WMO-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1 16858; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 16859; RV32IA-WMO-NEXT: and a7, a5, a3 16860; RV32IA-WMO-NEXT: mv a6, a5 16861; RV32IA-WMO-NEXT: sll a7, a7, a4 16862; RV32IA-WMO-NEXT: sra a7, a7, a4 16863; RV32IA-WMO-NEXT: bge a1, a7, .LBB116_3 16864; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1 16865; RV32IA-WMO-NEXT: xor a6, a5, a1 16866; RV32IA-WMO-NEXT: and a6, a6, a3 16867; RV32IA-WMO-NEXT: xor a6, a5, a6 16868; RV32IA-WMO-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1 16869; RV32IA-WMO-NEXT: sc.w a6, a6, (a2) 16870; RV32IA-WMO-NEXT: bnez a6, .LBB116_1 16871; RV32IA-WMO-NEXT: # %bb.4: 16872; RV32IA-WMO-NEXT: srl a0, a5, a0 16873; RV32IA-WMO-NEXT: ret 16874; 16875; RV32IA-TSO-LABEL: atomicrmw_min_i16_acquire: 16876; RV32IA-TSO: # %bb.0: 16877; RV32IA-TSO-NEXT: andi a2, a0, -4 16878; RV32IA-TSO-NEXT: slli a0, a0, 3 16879; RV32IA-TSO-NEXT: lui a3, 16 16880; RV32IA-TSO-NEXT: slli a1, a1, 16 16881; RV32IA-TSO-NEXT: li a4, 16 16882; RV32IA-TSO-NEXT: andi a5, a0, 24 16883; RV32IA-TSO-NEXT: addi a3, a3, -1 16884; RV32IA-TSO-NEXT: srai a1, a1, 16 16885; RV32IA-TSO-NEXT: sll a3, a3, a0 16886; RV32IA-TSO-NEXT: sll a1, a1, a0 16887; RV32IA-TSO-NEXT: sub a4, a4, a5 16888; RV32IA-TSO-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1 16889; RV32IA-TSO-NEXT: lr.w a5, (a2) 16890; RV32IA-TSO-NEXT: and a7, a5, a3 16891; RV32IA-TSO-NEXT: mv a6, a5 16892; RV32IA-TSO-NEXT: sll a7, a7, a4 16893; RV32IA-TSO-NEXT: sra a7, a7, a4 16894; RV32IA-TSO-NEXT: bge a1, a7, .LBB116_3 16895; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1 16896; RV32IA-TSO-NEXT: xor a6, a5, a1 16897; RV32IA-TSO-NEXT: and a6, a6, a3 16898; RV32IA-TSO-NEXT: xor a6, a5, a6 16899; RV32IA-TSO-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1 16900; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 16901; RV32IA-TSO-NEXT: bnez a6, .LBB116_1 16902; RV32IA-TSO-NEXT: # %bb.4: 16903; RV32IA-TSO-NEXT: srl a0, a5, a0 16904; RV32IA-TSO-NEXT: ret 16905; 16906; RV64I-LABEL: atomicrmw_min_i16_acquire: 16907; RV64I: # %bb.0: 16908; RV64I-NEXT: addi sp, sp, -48 16909; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 16910; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 16911; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 16912; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 16913; RV64I-NEXT: mv s0, a0 16914; RV64I-NEXT: lhu a3, 0(a0) 16915; RV64I-NEXT: mv s1, a1 16916; RV64I-NEXT: slli a0, a1, 48 16917; RV64I-NEXT: srai s2, a0, 48 16918; RV64I-NEXT: j .LBB116_2 16919; RV64I-NEXT: .LBB116_1: # %atomicrmw.start 16920; RV64I-NEXT: # in Loop: Header=BB116_2 Depth=1 16921; RV64I-NEXT: sh a3, 14(sp) 16922; RV64I-NEXT: addi a1, sp, 14 16923; RV64I-NEXT: li a3, 2 16924; RV64I-NEXT: li a4, 2 16925; RV64I-NEXT: mv a0, s0 16926; RV64I-NEXT: call __atomic_compare_exchange_2 16927; RV64I-NEXT: lh a3, 14(sp) 16928; RV64I-NEXT: bnez a0, .LBB116_4 16929; RV64I-NEXT: .LBB116_2: # %atomicrmw.start 16930; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 16931; RV64I-NEXT: slli a0, a3, 48 16932; RV64I-NEXT: srai a0, a0, 48 16933; RV64I-NEXT: mv a2, a3 16934; RV64I-NEXT: bge s2, a0, .LBB116_1 16935; RV64I-NEXT: # %bb.3: # %atomicrmw.start 16936; RV64I-NEXT: # in Loop: Header=BB116_2 Depth=1 16937; RV64I-NEXT: mv a2, s1 16938; RV64I-NEXT: j .LBB116_1 16939; RV64I-NEXT: .LBB116_4: # %atomicrmw.end 16940; RV64I-NEXT: mv a0, a3 16941; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 16942; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 16943; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 16944; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 16945; RV64I-NEXT: addi sp, sp, 48 16946; RV64I-NEXT: ret 16947; 16948; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_acquire: 16949; RV64IA-WMO-NOZACAS: # %bb.0: 16950; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 16951; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 16952; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 16953; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 16954; RV64IA-WMO-NOZACAS-NEXT: li a4, 48 16955; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24 16956; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 16957; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48 16958; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 16959; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 16960; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5 16961; RV64IA-WMO-NOZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1 16962; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 16963; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 16964; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 16965; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 16966; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 16967; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB116_3 16968; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1 16969; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 16970; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 16971; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 16972; RV64IA-WMO-NOZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1 16973; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2) 16974; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB116_1 16975; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 16976; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 16977; RV64IA-WMO-NOZACAS-NEXT: ret 16978; 16979; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_acquire: 16980; RV64IA-TSO-NOZACAS: # %bb.0: 16981; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 16982; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 16983; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 16984; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 16985; RV64IA-TSO-NOZACAS-NEXT: li a4, 48 16986; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24 16987; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 16988; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48 16989; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 16990; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 16991; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5 16992; RV64IA-TSO-NOZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1 16993; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 16994; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 16995; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 16996; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 16997; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 16998; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB116_3 16999; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1 17000; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 17001; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 17002; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 17003; RV64IA-TSO-NOZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1 17004; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 17005; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB116_1 17006; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 17007; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 17008; RV64IA-TSO-NOZACAS-NEXT: ret 17009; 17010; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_acquire: 17011; RV64IA-WMO-ZACAS: # %bb.0: 17012; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 17013; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 17014; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 17015; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 17016; RV64IA-WMO-ZACAS-NEXT: li a4, 48 17017; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24 17018; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 17019; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48 17020; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 17021; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 17022; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5 17023; RV64IA-WMO-ZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1 17024; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 17025; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 17026; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 17027; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 17028; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 17029; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB116_3 17030; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1 17031; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 17032; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 17033; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 17034; RV64IA-WMO-ZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1 17035; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2) 17036; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB116_1 17037; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 17038; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 17039; RV64IA-WMO-ZACAS-NEXT: ret 17040; 17041; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_acquire: 17042; RV64IA-TSO-ZACAS: # %bb.0: 17043; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 17044; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 17045; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 17046; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 17047; RV64IA-TSO-ZACAS-NEXT: li a4, 48 17048; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24 17049; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 17050; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48 17051; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 17052; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 17053; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5 17054; RV64IA-TSO-ZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1 17055; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 17056; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 17057; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 17058; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 17059; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 17060; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB116_3 17061; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1 17062; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 17063; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 17064; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 17065; RV64IA-TSO-ZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1 17066; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 17067; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB116_1 17068; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 17069; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 17070; RV64IA-TSO-ZACAS-NEXT: ret 17071; 17072; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_acquire: 17073; RV64IA-WMO-ZABHA: # %bb.0: 17074; RV64IA-WMO-ZABHA-NEXT: amomin.h.aq a0, a1, (a0) 17075; RV64IA-WMO-ZABHA-NEXT: ret 17076; 17077; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_acquire: 17078; RV64IA-TSO-ZABHA: # %bb.0: 17079; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0) 17080; RV64IA-TSO-ZABHA-NEXT: ret 17081 %1 = atomicrmw min ptr %a, i16 %b acquire 17082 ret i16 %1 17083} 17084 17085define i16 @atomicrmw_min_i16_release(ptr %a, i16 %b) nounwind { 17086; RV32I-LABEL: atomicrmw_min_i16_release: 17087; RV32I: # %bb.0: 17088; RV32I-NEXT: addi sp, sp, -32 17089; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17090; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17091; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17092; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17093; RV32I-NEXT: mv s0, a0 17094; RV32I-NEXT: lhu a3, 0(a0) 17095; RV32I-NEXT: mv s1, a1 17096; RV32I-NEXT: slli a0, a1, 16 17097; RV32I-NEXT: srai s2, a0, 16 17098; RV32I-NEXT: j .LBB117_2 17099; RV32I-NEXT: .LBB117_1: # %atomicrmw.start 17100; RV32I-NEXT: # in Loop: Header=BB117_2 Depth=1 17101; RV32I-NEXT: sh a3, 14(sp) 17102; RV32I-NEXT: addi a1, sp, 14 17103; RV32I-NEXT: li a3, 3 17104; RV32I-NEXT: mv a0, s0 17105; RV32I-NEXT: li a4, 0 17106; RV32I-NEXT: call __atomic_compare_exchange_2 17107; RV32I-NEXT: lh a3, 14(sp) 17108; RV32I-NEXT: bnez a0, .LBB117_4 17109; RV32I-NEXT: .LBB117_2: # %atomicrmw.start 17110; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17111; RV32I-NEXT: slli a0, a3, 16 17112; RV32I-NEXT: srai a0, a0, 16 17113; RV32I-NEXT: mv a2, a3 17114; RV32I-NEXT: bge s2, a0, .LBB117_1 17115; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17116; RV32I-NEXT: # in Loop: Header=BB117_2 Depth=1 17117; RV32I-NEXT: mv a2, s1 17118; RV32I-NEXT: j .LBB117_1 17119; RV32I-NEXT: .LBB117_4: # %atomicrmw.end 17120; RV32I-NEXT: mv a0, a3 17121; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17122; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17123; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17124; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17125; RV32I-NEXT: addi sp, sp, 32 17126; RV32I-NEXT: ret 17127; 17128; RV32IA-WMO-LABEL: atomicrmw_min_i16_release: 17129; RV32IA-WMO: # %bb.0: 17130; RV32IA-WMO-NEXT: andi a2, a0, -4 17131; RV32IA-WMO-NEXT: slli a0, a0, 3 17132; RV32IA-WMO-NEXT: lui a3, 16 17133; RV32IA-WMO-NEXT: slli a1, a1, 16 17134; RV32IA-WMO-NEXT: li a4, 16 17135; RV32IA-WMO-NEXT: andi a5, a0, 24 17136; RV32IA-WMO-NEXT: addi a3, a3, -1 17137; RV32IA-WMO-NEXT: srai a1, a1, 16 17138; RV32IA-WMO-NEXT: sll a3, a3, a0 17139; RV32IA-WMO-NEXT: sll a1, a1, a0 17140; RV32IA-WMO-NEXT: sub a4, a4, a5 17141; RV32IA-WMO-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1 17142; RV32IA-WMO-NEXT: lr.w a5, (a2) 17143; RV32IA-WMO-NEXT: and a7, a5, a3 17144; RV32IA-WMO-NEXT: mv a6, a5 17145; RV32IA-WMO-NEXT: sll a7, a7, a4 17146; RV32IA-WMO-NEXT: sra a7, a7, a4 17147; RV32IA-WMO-NEXT: bge a1, a7, .LBB117_3 17148; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1 17149; RV32IA-WMO-NEXT: xor a6, a5, a1 17150; RV32IA-WMO-NEXT: and a6, a6, a3 17151; RV32IA-WMO-NEXT: xor a6, a5, a6 17152; RV32IA-WMO-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1 17153; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 17154; RV32IA-WMO-NEXT: bnez a6, .LBB117_1 17155; RV32IA-WMO-NEXT: # %bb.4: 17156; RV32IA-WMO-NEXT: srl a0, a5, a0 17157; RV32IA-WMO-NEXT: ret 17158; 17159; RV32IA-TSO-LABEL: atomicrmw_min_i16_release: 17160; RV32IA-TSO: # %bb.0: 17161; RV32IA-TSO-NEXT: andi a2, a0, -4 17162; RV32IA-TSO-NEXT: slli a0, a0, 3 17163; RV32IA-TSO-NEXT: lui a3, 16 17164; RV32IA-TSO-NEXT: slli a1, a1, 16 17165; RV32IA-TSO-NEXT: li a4, 16 17166; RV32IA-TSO-NEXT: andi a5, a0, 24 17167; RV32IA-TSO-NEXT: addi a3, a3, -1 17168; RV32IA-TSO-NEXT: srai a1, a1, 16 17169; RV32IA-TSO-NEXT: sll a3, a3, a0 17170; RV32IA-TSO-NEXT: sll a1, a1, a0 17171; RV32IA-TSO-NEXT: sub a4, a4, a5 17172; RV32IA-TSO-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1 17173; RV32IA-TSO-NEXT: lr.w a5, (a2) 17174; RV32IA-TSO-NEXT: and a7, a5, a3 17175; RV32IA-TSO-NEXT: mv a6, a5 17176; RV32IA-TSO-NEXT: sll a7, a7, a4 17177; RV32IA-TSO-NEXT: sra a7, a7, a4 17178; RV32IA-TSO-NEXT: bge a1, a7, .LBB117_3 17179; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1 17180; RV32IA-TSO-NEXT: xor a6, a5, a1 17181; RV32IA-TSO-NEXT: and a6, a6, a3 17182; RV32IA-TSO-NEXT: xor a6, a5, a6 17183; RV32IA-TSO-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1 17184; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 17185; RV32IA-TSO-NEXT: bnez a6, .LBB117_1 17186; RV32IA-TSO-NEXT: # %bb.4: 17187; RV32IA-TSO-NEXT: srl a0, a5, a0 17188; RV32IA-TSO-NEXT: ret 17189; 17190; RV64I-LABEL: atomicrmw_min_i16_release: 17191; RV64I: # %bb.0: 17192; RV64I-NEXT: addi sp, sp, -48 17193; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 17194; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 17195; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 17196; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 17197; RV64I-NEXT: mv s0, a0 17198; RV64I-NEXT: lhu a3, 0(a0) 17199; RV64I-NEXT: mv s1, a1 17200; RV64I-NEXT: slli a0, a1, 48 17201; RV64I-NEXT: srai s2, a0, 48 17202; RV64I-NEXT: j .LBB117_2 17203; RV64I-NEXT: .LBB117_1: # %atomicrmw.start 17204; RV64I-NEXT: # in Loop: Header=BB117_2 Depth=1 17205; RV64I-NEXT: sh a3, 14(sp) 17206; RV64I-NEXT: addi a1, sp, 14 17207; RV64I-NEXT: li a3, 3 17208; RV64I-NEXT: mv a0, s0 17209; RV64I-NEXT: li a4, 0 17210; RV64I-NEXT: call __atomic_compare_exchange_2 17211; RV64I-NEXT: lh a3, 14(sp) 17212; RV64I-NEXT: bnez a0, .LBB117_4 17213; RV64I-NEXT: .LBB117_2: # %atomicrmw.start 17214; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17215; RV64I-NEXT: slli a0, a3, 48 17216; RV64I-NEXT: srai a0, a0, 48 17217; RV64I-NEXT: mv a2, a3 17218; RV64I-NEXT: bge s2, a0, .LBB117_1 17219; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17220; RV64I-NEXT: # in Loop: Header=BB117_2 Depth=1 17221; RV64I-NEXT: mv a2, s1 17222; RV64I-NEXT: j .LBB117_1 17223; RV64I-NEXT: .LBB117_4: # %atomicrmw.end 17224; RV64I-NEXT: mv a0, a3 17225; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 17226; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 17227; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 17228; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 17229; RV64I-NEXT: addi sp, sp, 48 17230; RV64I-NEXT: ret 17231; 17232; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_release: 17233; RV64IA-WMO-NOZACAS: # %bb.0: 17234; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 17235; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 17236; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 17237; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 17238; RV64IA-WMO-NOZACAS-NEXT: li a4, 48 17239; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24 17240; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 17241; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48 17242; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 17243; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 17244; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5 17245; RV64IA-WMO-NOZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1 17246; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2) 17247; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 17248; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 17249; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 17250; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 17251; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB117_3 17252; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1 17253; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 17254; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 17255; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 17256; RV64IA-WMO-NOZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1 17257; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 17258; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB117_1 17259; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 17260; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 17261; RV64IA-WMO-NOZACAS-NEXT: ret 17262; 17263; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_release: 17264; RV64IA-TSO-NOZACAS: # %bb.0: 17265; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 17266; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 17267; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 17268; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 17269; RV64IA-TSO-NOZACAS-NEXT: li a4, 48 17270; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24 17271; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 17272; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48 17273; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 17274; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 17275; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5 17276; RV64IA-TSO-NOZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1 17277; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 17278; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 17279; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 17280; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 17281; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 17282; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB117_3 17283; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1 17284; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 17285; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 17286; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 17287; RV64IA-TSO-NOZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1 17288; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 17289; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB117_1 17290; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 17291; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 17292; RV64IA-TSO-NOZACAS-NEXT: ret 17293; 17294; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_release: 17295; RV64IA-WMO-ZACAS: # %bb.0: 17296; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 17297; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 17298; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 17299; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 17300; RV64IA-WMO-ZACAS-NEXT: li a4, 48 17301; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24 17302; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 17303; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48 17304; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 17305; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 17306; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5 17307; RV64IA-WMO-ZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1 17308; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2) 17309; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 17310; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 17311; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 17312; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 17313; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB117_3 17314; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1 17315; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 17316; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 17317; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 17318; RV64IA-WMO-ZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1 17319; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 17320; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB117_1 17321; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 17322; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 17323; RV64IA-WMO-ZACAS-NEXT: ret 17324; 17325; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_release: 17326; RV64IA-TSO-ZACAS: # %bb.0: 17327; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 17328; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 17329; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 17330; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 17331; RV64IA-TSO-ZACAS-NEXT: li a4, 48 17332; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24 17333; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 17334; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48 17335; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 17336; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 17337; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5 17338; RV64IA-TSO-ZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1 17339; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 17340; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 17341; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 17342; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 17343; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 17344; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB117_3 17345; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1 17346; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 17347; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 17348; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 17349; RV64IA-TSO-ZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1 17350; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 17351; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB117_1 17352; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 17353; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 17354; RV64IA-TSO-ZACAS-NEXT: ret 17355; 17356; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_release: 17357; RV64IA-WMO-ZABHA: # %bb.0: 17358; RV64IA-WMO-ZABHA-NEXT: amomin.h.rl a0, a1, (a0) 17359; RV64IA-WMO-ZABHA-NEXT: ret 17360; 17361; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_release: 17362; RV64IA-TSO-ZABHA: # %bb.0: 17363; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0) 17364; RV64IA-TSO-ZABHA-NEXT: ret 17365 %1 = atomicrmw min ptr %a, i16 %b release 17366 ret i16 %1 17367} 17368 17369define i16 @atomicrmw_min_i16_acq_rel(ptr %a, i16 %b) nounwind { 17370; RV32I-LABEL: atomicrmw_min_i16_acq_rel: 17371; RV32I: # %bb.0: 17372; RV32I-NEXT: addi sp, sp, -32 17373; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17374; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17375; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17376; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17377; RV32I-NEXT: mv s0, a0 17378; RV32I-NEXT: lhu a3, 0(a0) 17379; RV32I-NEXT: mv s1, a1 17380; RV32I-NEXT: slli a0, a1, 16 17381; RV32I-NEXT: srai s2, a0, 16 17382; RV32I-NEXT: j .LBB118_2 17383; RV32I-NEXT: .LBB118_1: # %atomicrmw.start 17384; RV32I-NEXT: # in Loop: Header=BB118_2 Depth=1 17385; RV32I-NEXT: sh a3, 14(sp) 17386; RV32I-NEXT: addi a1, sp, 14 17387; RV32I-NEXT: li a3, 4 17388; RV32I-NEXT: li a4, 2 17389; RV32I-NEXT: mv a0, s0 17390; RV32I-NEXT: call __atomic_compare_exchange_2 17391; RV32I-NEXT: lh a3, 14(sp) 17392; RV32I-NEXT: bnez a0, .LBB118_4 17393; RV32I-NEXT: .LBB118_2: # %atomicrmw.start 17394; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17395; RV32I-NEXT: slli a0, a3, 16 17396; RV32I-NEXT: srai a0, a0, 16 17397; RV32I-NEXT: mv a2, a3 17398; RV32I-NEXT: bge s2, a0, .LBB118_1 17399; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17400; RV32I-NEXT: # in Loop: Header=BB118_2 Depth=1 17401; RV32I-NEXT: mv a2, s1 17402; RV32I-NEXT: j .LBB118_1 17403; RV32I-NEXT: .LBB118_4: # %atomicrmw.end 17404; RV32I-NEXT: mv a0, a3 17405; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17406; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17407; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17408; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17409; RV32I-NEXT: addi sp, sp, 32 17410; RV32I-NEXT: ret 17411; 17412; RV32IA-WMO-LABEL: atomicrmw_min_i16_acq_rel: 17413; RV32IA-WMO: # %bb.0: 17414; RV32IA-WMO-NEXT: andi a2, a0, -4 17415; RV32IA-WMO-NEXT: slli a0, a0, 3 17416; RV32IA-WMO-NEXT: lui a3, 16 17417; RV32IA-WMO-NEXT: slli a1, a1, 16 17418; RV32IA-WMO-NEXT: li a4, 16 17419; RV32IA-WMO-NEXT: andi a5, a0, 24 17420; RV32IA-WMO-NEXT: addi a3, a3, -1 17421; RV32IA-WMO-NEXT: srai a1, a1, 16 17422; RV32IA-WMO-NEXT: sll a3, a3, a0 17423; RV32IA-WMO-NEXT: sll a1, a1, a0 17424; RV32IA-WMO-NEXT: sub a4, a4, a5 17425; RV32IA-WMO-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1 17426; RV32IA-WMO-NEXT: lr.w.aq a5, (a2) 17427; RV32IA-WMO-NEXT: and a7, a5, a3 17428; RV32IA-WMO-NEXT: mv a6, a5 17429; RV32IA-WMO-NEXT: sll a7, a7, a4 17430; RV32IA-WMO-NEXT: sra a7, a7, a4 17431; RV32IA-WMO-NEXT: bge a1, a7, .LBB118_3 17432; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1 17433; RV32IA-WMO-NEXT: xor a6, a5, a1 17434; RV32IA-WMO-NEXT: and a6, a6, a3 17435; RV32IA-WMO-NEXT: xor a6, a5, a6 17436; RV32IA-WMO-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1 17437; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2) 17438; RV32IA-WMO-NEXT: bnez a6, .LBB118_1 17439; RV32IA-WMO-NEXT: # %bb.4: 17440; RV32IA-WMO-NEXT: srl a0, a5, a0 17441; RV32IA-WMO-NEXT: ret 17442; 17443; RV32IA-TSO-LABEL: atomicrmw_min_i16_acq_rel: 17444; RV32IA-TSO: # %bb.0: 17445; RV32IA-TSO-NEXT: andi a2, a0, -4 17446; RV32IA-TSO-NEXT: slli a0, a0, 3 17447; RV32IA-TSO-NEXT: lui a3, 16 17448; RV32IA-TSO-NEXT: slli a1, a1, 16 17449; RV32IA-TSO-NEXT: li a4, 16 17450; RV32IA-TSO-NEXT: andi a5, a0, 24 17451; RV32IA-TSO-NEXT: addi a3, a3, -1 17452; RV32IA-TSO-NEXT: srai a1, a1, 16 17453; RV32IA-TSO-NEXT: sll a3, a3, a0 17454; RV32IA-TSO-NEXT: sll a1, a1, a0 17455; RV32IA-TSO-NEXT: sub a4, a4, a5 17456; RV32IA-TSO-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1 17457; RV32IA-TSO-NEXT: lr.w a5, (a2) 17458; RV32IA-TSO-NEXT: and a7, a5, a3 17459; RV32IA-TSO-NEXT: mv a6, a5 17460; RV32IA-TSO-NEXT: sll a7, a7, a4 17461; RV32IA-TSO-NEXT: sra a7, a7, a4 17462; RV32IA-TSO-NEXT: bge a1, a7, .LBB118_3 17463; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1 17464; RV32IA-TSO-NEXT: xor a6, a5, a1 17465; RV32IA-TSO-NEXT: and a6, a6, a3 17466; RV32IA-TSO-NEXT: xor a6, a5, a6 17467; RV32IA-TSO-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1 17468; RV32IA-TSO-NEXT: sc.w a6, a6, (a2) 17469; RV32IA-TSO-NEXT: bnez a6, .LBB118_1 17470; RV32IA-TSO-NEXT: # %bb.4: 17471; RV32IA-TSO-NEXT: srl a0, a5, a0 17472; RV32IA-TSO-NEXT: ret 17473; 17474; RV64I-LABEL: atomicrmw_min_i16_acq_rel: 17475; RV64I: # %bb.0: 17476; RV64I-NEXT: addi sp, sp, -48 17477; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 17478; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 17479; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 17480; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 17481; RV64I-NEXT: mv s0, a0 17482; RV64I-NEXT: lhu a3, 0(a0) 17483; RV64I-NEXT: mv s1, a1 17484; RV64I-NEXT: slli a0, a1, 48 17485; RV64I-NEXT: srai s2, a0, 48 17486; RV64I-NEXT: j .LBB118_2 17487; RV64I-NEXT: .LBB118_1: # %atomicrmw.start 17488; RV64I-NEXT: # in Loop: Header=BB118_2 Depth=1 17489; RV64I-NEXT: sh a3, 14(sp) 17490; RV64I-NEXT: addi a1, sp, 14 17491; RV64I-NEXT: li a3, 4 17492; RV64I-NEXT: li a4, 2 17493; RV64I-NEXT: mv a0, s0 17494; RV64I-NEXT: call __atomic_compare_exchange_2 17495; RV64I-NEXT: lh a3, 14(sp) 17496; RV64I-NEXT: bnez a0, .LBB118_4 17497; RV64I-NEXT: .LBB118_2: # %atomicrmw.start 17498; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17499; RV64I-NEXT: slli a0, a3, 48 17500; RV64I-NEXT: srai a0, a0, 48 17501; RV64I-NEXT: mv a2, a3 17502; RV64I-NEXT: bge s2, a0, .LBB118_1 17503; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17504; RV64I-NEXT: # in Loop: Header=BB118_2 Depth=1 17505; RV64I-NEXT: mv a2, s1 17506; RV64I-NEXT: j .LBB118_1 17507; RV64I-NEXT: .LBB118_4: # %atomicrmw.end 17508; RV64I-NEXT: mv a0, a3 17509; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 17510; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 17511; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 17512; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 17513; RV64I-NEXT: addi sp, sp, 48 17514; RV64I-NEXT: ret 17515; 17516; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_acq_rel: 17517; RV64IA-WMO-NOZACAS: # %bb.0: 17518; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 17519; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 17520; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 17521; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48 17522; RV64IA-WMO-NOZACAS-NEXT: li a4, 48 17523; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24 17524; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 17525; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48 17526; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0 17527; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 17528; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5 17529; RV64IA-WMO-NOZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1 17530; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2) 17531; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3 17532; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5 17533; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4 17534; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4 17535; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB118_3 17536; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1 17537; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1 17538; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3 17539; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6 17540; RV64IA-WMO-NOZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1 17541; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 17542; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB118_1 17543; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 17544; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0 17545; RV64IA-WMO-NOZACAS-NEXT: ret 17546; 17547; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_acq_rel: 17548; RV64IA-TSO-NOZACAS: # %bb.0: 17549; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 17550; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 17551; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 17552; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48 17553; RV64IA-TSO-NOZACAS-NEXT: li a4, 48 17554; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24 17555; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 17556; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48 17557; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0 17558; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 17559; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5 17560; RV64IA-TSO-NOZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1 17561; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2) 17562; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3 17563; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5 17564; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4 17565; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4 17566; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB118_3 17567; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1 17568; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1 17569; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3 17570; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6 17571; RV64IA-TSO-NOZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1 17572; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2) 17573; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB118_1 17574; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 17575; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0 17576; RV64IA-TSO-NOZACAS-NEXT: ret 17577; 17578; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_acq_rel: 17579; RV64IA-WMO-ZACAS: # %bb.0: 17580; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 17581; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 17582; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 17583; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48 17584; RV64IA-WMO-ZACAS-NEXT: li a4, 48 17585; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24 17586; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 17587; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48 17588; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0 17589; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 17590; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5 17591; RV64IA-WMO-ZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1 17592; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2) 17593; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3 17594; RV64IA-WMO-ZACAS-NEXT: mv a6, a5 17595; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4 17596; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4 17597; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB118_3 17598; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1 17599; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1 17600; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3 17601; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6 17602; RV64IA-WMO-ZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1 17603; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 17604; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB118_1 17605; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 17606; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0 17607; RV64IA-WMO-ZACAS-NEXT: ret 17608; 17609; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_acq_rel: 17610; RV64IA-TSO-ZACAS: # %bb.0: 17611; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 17612; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 17613; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 17614; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48 17615; RV64IA-TSO-ZACAS-NEXT: li a4, 48 17616; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24 17617; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 17618; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48 17619; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0 17620; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 17621; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5 17622; RV64IA-TSO-ZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1 17623; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2) 17624; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3 17625; RV64IA-TSO-ZACAS-NEXT: mv a6, a5 17626; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4 17627; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4 17628; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB118_3 17629; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1 17630; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1 17631; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3 17632; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6 17633; RV64IA-TSO-ZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1 17634; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2) 17635; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB118_1 17636; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 17637; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0 17638; RV64IA-TSO-ZACAS-NEXT: ret 17639; 17640; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_acq_rel: 17641; RV64IA-WMO-ZABHA: # %bb.0: 17642; RV64IA-WMO-ZABHA-NEXT: amomin.h.aqrl a0, a1, (a0) 17643; RV64IA-WMO-ZABHA-NEXT: ret 17644; 17645; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_acq_rel: 17646; RV64IA-TSO-ZABHA: # %bb.0: 17647; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0) 17648; RV64IA-TSO-ZABHA-NEXT: ret 17649 %1 = atomicrmw min ptr %a, i16 %b acq_rel 17650 ret i16 %1 17651} 17652 17653define i16 @atomicrmw_min_i16_seq_cst(ptr %a, i16 %b) nounwind { 17654; RV32I-LABEL: atomicrmw_min_i16_seq_cst: 17655; RV32I: # %bb.0: 17656; RV32I-NEXT: addi sp, sp, -32 17657; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17658; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17659; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17660; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17661; RV32I-NEXT: mv s0, a0 17662; RV32I-NEXT: lhu a3, 0(a0) 17663; RV32I-NEXT: mv s1, a1 17664; RV32I-NEXT: slli a0, a1, 16 17665; RV32I-NEXT: srai s2, a0, 16 17666; RV32I-NEXT: j .LBB119_2 17667; RV32I-NEXT: .LBB119_1: # %atomicrmw.start 17668; RV32I-NEXT: # in Loop: Header=BB119_2 Depth=1 17669; RV32I-NEXT: sh a3, 14(sp) 17670; RV32I-NEXT: addi a1, sp, 14 17671; RV32I-NEXT: li a3, 5 17672; RV32I-NEXT: li a4, 5 17673; RV32I-NEXT: mv a0, s0 17674; RV32I-NEXT: call __atomic_compare_exchange_2 17675; RV32I-NEXT: lh a3, 14(sp) 17676; RV32I-NEXT: bnez a0, .LBB119_4 17677; RV32I-NEXT: .LBB119_2: # %atomicrmw.start 17678; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17679; RV32I-NEXT: slli a0, a3, 16 17680; RV32I-NEXT: srai a0, a0, 16 17681; RV32I-NEXT: mv a2, a3 17682; RV32I-NEXT: bge s2, a0, .LBB119_1 17683; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17684; RV32I-NEXT: # in Loop: Header=BB119_2 Depth=1 17685; RV32I-NEXT: mv a2, s1 17686; RV32I-NEXT: j .LBB119_1 17687; RV32I-NEXT: .LBB119_4: # %atomicrmw.end 17688; RV32I-NEXT: mv a0, a3 17689; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17690; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17691; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17692; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17693; RV32I-NEXT: addi sp, sp, 32 17694; RV32I-NEXT: ret 17695; 17696; RV32IA-LABEL: atomicrmw_min_i16_seq_cst: 17697; RV32IA: # %bb.0: 17698; RV32IA-NEXT: andi a2, a0, -4 17699; RV32IA-NEXT: slli a0, a0, 3 17700; RV32IA-NEXT: lui a3, 16 17701; RV32IA-NEXT: slli a1, a1, 16 17702; RV32IA-NEXT: li a4, 16 17703; RV32IA-NEXT: andi a5, a0, 24 17704; RV32IA-NEXT: addi a3, a3, -1 17705; RV32IA-NEXT: srai a1, a1, 16 17706; RV32IA-NEXT: sll a3, a3, a0 17707; RV32IA-NEXT: sll a1, a1, a0 17708; RV32IA-NEXT: sub a4, a4, a5 17709; RV32IA-NEXT: .LBB119_1: # =>This Inner Loop Header: Depth=1 17710; RV32IA-NEXT: lr.w.aqrl a5, (a2) 17711; RV32IA-NEXT: and a7, a5, a3 17712; RV32IA-NEXT: mv a6, a5 17713; RV32IA-NEXT: sll a7, a7, a4 17714; RV32IA-NEXT: sra a7, a7, a4 17715; RV32IA-NEXT: bge a1, a7, .LBB119_3 17716; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB119_1 Depth=1 17717; RV32IA-NEXT: xor a6, a5, a1 17718; RV32IA-NEXT: and a6, a6, a3 17719; RV32IA-NEXT: xor a6, a5, a6 17720; RV32IA-NEXT: .LBB119_3: # in Loop: Header=BB119_1 Depth=1 17721; RV32IA-NEXT: sc.w.rl a6, a6, (a2) 17722; RV32IA-NEXT: bnez a6, .LBB119_1 17723; RV32IA-NEXT: # %bb.4: 17724; RV32IA-NEXT: srl a0, a5, a0 17725; RV32IA-NEXT: ret 17726; 17727; RV64I-LABEL: atomicrmw_min_i16_seq_cst: 17728; RV64I: # %bb.0: 17729; RV64I-NEXT: addi sp, sp, -48 17730; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 17731; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 17732; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 17733; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 17734; RV64I-NEXT: mv s0, a0 17735; RV64I-NEXT: lhu a3, 0(a0) 17736; RV64I-NEXT: mv s1, a1 17737; RV64I-NEXT: slli a0, a1, 48 17738; RV64I-NEXT: srai s2, a0, 48 17739; RV64I-NEXT: j .LBB119_2 17740; RV64I-NEXT: .LBB119_1: # %atomicrmw.start 17741; RV64I-NEXT: # in Loop: Header=BB119_2 Depth=1 17742; RV64I-NEXT: sh a3, 14(sp) 17743; RV64I-NEXT: addi a1, sp, 14 17744; RV64I-NEXT: li a3, 5 17745; RV64I-NEXT: li a4, 5 17746; RV64I-NEXT: mv a0, s0 17747; RV64I-NEXT: call __atomic_compare_exchange_2 17748; RV64I-NEXT: lh a3, 14(sp) 17749; RV64I-NEXT: bnez a0, .LBB119_4 17750; RV64I-NEXT: .LBB119_2: # %atomicrmw.start 17751; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17752; RV64I-NEXT: slli a0, a3, 48 17753; RV64I-NEXT: srai a0, a0, 48 17754; RV64I-NEXT: mv a2, a3 17755; RV64I-NEXT: bge s2, a0, .LBB119_1 17756; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17757; RV64I-NEXT: # in Loop: Header=BB119_2 Depth=1 17758; RV64I-NEXT: mv a2, s1 17759; RV64I-NEXT: j .LBB119_1 17760; RV64I-NEXT: .LBB119_4: # %atomicrmw.end 17761; RV64I-NEXT: mv a0, a3 17762; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 17763; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 17764; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 17765; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 17766; RV64I-NEXT: addi sp, sp, 48 17767; RV64I-NEXT: ret 17768; 17769; RV64IA-NOZACAS-LABEL: atomicrmw_min_i16_seq_cst: 17770; RV64IA-NOZACAS: # %bb.0: 17771; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 17772; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 17773; RV64IA-NOZACAS-NEXT: lui a3, 16 17774; RV64IA-NOZACAS-NEXT: slli a1, a1, 48 17775; RV64IA-NOZACAS-NEXT: li a4, 48 17776; RV64IA-NOZACAS-NEXT: andi a5, a0, 24 17777; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 17778; RV64IA-NOZACAS-NEXT: srai a1, a1, 48 17779; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0 17780; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 17781; RV64IA-NOZACAS-NEXT: sub a4, a4, a5 17782; RV64IA-NOZACAS-NEXT: .LBB119_1: # =>This Inner Loop Header: Depth=1 17783; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2) 17784; RV64IA-NOZACAS-NEXT: and a7, a5, a3 17785; RV64IA-NOZACAS-NEXT: mv a6, a5 17786; RV64IA-NOZACAS-NEXT: sll a7, a7, a4 17787; RV64IA-NOZACAS-NEXT: sra a7, a7, a4 17788; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB119_3 17789; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB119_1 Depth=1 17790; RV64IA-NOZACAS-NEXT: xor a6, a5, a1 17791; RV64IA-NOZACAS-NEXT: and a6, a6, a3 17792; RV64IA-NOZACAS-NEXT: xor a6, a5, a6 17793; RV64IA-NOZACAS-NEXT: .LBB119_3: # in Loop: Header=BB119_1 Depth=1 17794; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2) 17795; RV64IA-NOZACAS-NEXT: bnez a6, .LBB119_1 17796; RV64IA-NOZACAS-NEXT: # %bb.4: 17797; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0 17798; RV64IA-NOZACAS-NEXT: ret 17799; 17800; RV64IA-ZACAS-LABEL: atomicrmw_min_i16_seq_cst: 17801; RV64IA-ZACAS: # %bb.0: 17802; RV64IA-ZACAS-NEXT: andi a2, a0, -4 17803; RV64IA-ZACAS-NEXT: slli a0, a0, 3 17804; RV64IA-ZACAS-NEXT: lui a3, 16 17805; RV64IA-ZACAS-NEXT: slli a1, a1, 48 17806; RV64IA-ZACAS-NEXT: li a4, 48 17807; RV64IA-ZACAS-NEXT: andi a5, a0, 24 17808; RV64IA-ZACAS-NEXT: addi a3, a3, -1 17809; RV64IA-ZACAS-NEXT: srai a1, a1, 48 17810; RV64IA-ZACAS-NEXT: sllw a3, a3, a0 17811; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 17812; RV64IA-ZACAS-NEXT: sub a4, a4, a5 17813; RV64IA-ZACAS-NEXT: .LBB119_1: # =>This Inner Loop Header: Depth=1 17814; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2) 17815; RV64IA-ZACAS-NEXT: and a7, a5, a3 17816; RV64IA-ZACAS-NEXT: mv a6, a5 17817; RV64IA-ZACAS-NEXT: sll a7, a7, a4 17818; RV64IA-ZACAS-NEXT: sra a7, a7, a4 17819; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB119_3 17820; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB119_1 Depth=1 17821; RV64IA-ZACAS-NEXT: xor a6, a5, a1 17822; RV64IA-ZACAS-NEXT: and a6, a6, a3 17823; RV64IA-ZACAS-NEXT: xor a6, a5, a6 17824; RV64IA-ZACAS-NEXT: .LBB119_3: # in Loop: Header=BB119_1 Depth=1 17825; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2) 17826; RV64IA-ZACAS-NEXT: bnez a6, .LBB119_1 17827; RV64IA-ZACAS-NEXT: # %bb.4: 17828; RV64IA-ZACAS-NEXT: srlw a0, a5, a0 17829; RV64IA-ZACAS-NEXT: ret 17830; 17831; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_seq_cst: 17832; RV64IA-WMO-ZABHA: # %bb.0: 17833; RV64IA-WMO-ZABHA-NEXT: amomin.h.aqrl a0, a1, (a0) 17834; RV64IA-WMO-ZABHA-NEXT: ret 17835; 17836; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_seq_cst: 17837; RV64IA-TSO-ZABHA: # %bb.0: 17838; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0) 17839; RV64IA-TSO-ZABHA-NEXT: ret 17840 %1 = atomicrmw min ptr %a, i16 %b seq_cst 17841 ret i16 %1 17842} 17843 17844define i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind { 17845; RV32I-LABEL: atomicrmw_umax_i16_monotonic: 17846; RV32I: # %bb.0: 17847; RV32I-NEXT: addi sp, sp, -32 17848; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 17849; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17850; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 17851; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 17852; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 17853; RV32I-NEXT: mv s0, a1 17854; RV32I-NEXT: mv s1, a0 17855; RV32I-NEXT: lhu a1, 0(a0) 17856; RV32I-NEXT: lui s2, 16 17857; RV32I-NEXT: addi s2, s2, -1 17858; RV32I-NEXT: and s3, s0, s2 17859; RV32I-NEXT: j .LBB120_2 17860; RV32I-NEXT: .LBB120_1: # %atomicrmw.start 17861; RV32I-NEXT: # in Loop: Header=BB120_2 Depth=1 17862; RV32I-NEXT: sh a1, 10(sp) 17863; RV32I-NEXT: addi a1, sp, 10 17864; RV32I-NEXT: mv a0, s1 17865; RV32I-NEXT: li a3, 0 17866; RV32I-NEXT: li a4, 0 17867; RV32I-NEXT: call __atomic_compare_exchange_2 17868; RV32I-NEXT: lh a1, 10(sp) 17869; RV32I-NEXT: bnez a0, .LBB120_4 17870; RV32I-NEXT: .LBB120_2: # %atomicrmw.start 17871; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 17872; RV32I-NEXT: and a0, a1, s2 17873; RV32I-NEXT: mv a2, a1 17874; RV32I-NEXT: bltu s3, a0, .LBB120_1 17875; RV32I-NEXT: # %bb.3: # %atomicrmw.start 17876; RV32I-NEXT: # in Loop: Header=BB120_2 Depth=1 17877; RV32I-NEXT: mv a2, s0 17878; RV32I-NEXT: j .LBB120_1 17879; RV32I-NEXT: .LBB120_4: # %atomicrmw.end 17880; RV32I-NEXT: mv a0, a1 17881; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 17882; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 17883; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 17884; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 17885; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 17886; RV32I-NEXT: addi sp, sp, 32 17887; RV32I-NEXT: ret 17888; 17889; RV32IA-LABEL: atomicrmw_umax_i16_monotonic: 17890; RV32IA: # %bb.0: 17891; RV32IA-NEXT: andi a2, a0, -4 17892; RV32IA-NEXT: slli a0, a0, 3 17893; RV32IA-NEXT: lui a3, 16 17894; RV32IA-NEXT: addi a3, a3, -1 17895; RV32IA-NEXT: sll a4, a3, a0 17896; RV32IA-NEXT: and a1, a1, a3 17897; RV32IA-NEXT: sll a1, a1, a0 17898; RV32IA-NEXT: .LBB120_1: # =>This Inner Loop Header: Depth=1 17899; RV32IA-NEXT: lr.w a3, (a2) 17900; RV32IA-NEXT: and a6, a3, a4 17901; RV32IA-NEXT: mv a5, a3 17902; RV32IA-NEXT: bgeu a6, a1, .LBB120_3 17903; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB120_1 Depth=1 17904; RV32IA-NEXT: xor a5, a3, a1 17905; RV32IA-NEXT: and a5, a5, a4 17906; RV32IA-NEXT: xor a5, a3, a5 17907; RV32IA-NEXT: .LBB120_3: # in Loop: Header=BB120_1 Depth=1 17908; RV32IA-NEXT: sc.w a5, a5, (a2) 17909; RV32IA-NEXT: bnez a5, .LBB120_1 17910; RV32IA-NEXT: # %bb.4: 17911; RV32IA-NEXT: srl a0, a3, a0 17912; RV32IA-NEXT: ret 17913; 17914; RV64I-LABEL: atomicrmw_umax_i16_monotonic: 17915; RV64I: # %bb.0: 17916; RV64I-NEXT: addi sp, sp, -48 17917; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 17918; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 17919; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 17920; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 17921; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 17922; RV64I-NEXT: mv s0, a1 17923; RV64I-NEXT: mv s1, a0 17924; RV64I-NEXT: lhu a1, 0(a0) 17925; RV64I-NEXT: lui s2, 16 17926; RV64I-NEXT: addiw s2, s2, -1 17927; RV64I-NEXT: and s3, s0, s2 17928; RV64I-NEXT: j .LBB120_2 17929; RV64I-NEXT: .LBB120_1: # %atomicrmw.start 17930; RV64I-NEXT: # in Loop: Header=BB120_2 Depth=1 17931; RV64I-NEXT: sh a1, 6(sp) 17932; RV64I-NEXT: addi a1, sp, 6 17933; RV64I-NEXT: mv a0, s1 17934; RV64I-NEXT: li a3, 0 17935; RV64I-NEXT: li a4, 0 17936; RV64I-NEXT: call __atomic_compare_exchange_2 17937; RV64I-NEXT: lh a1, 6(sp) 17938; RV64I-NEXT: bnez a0, .LBB120_4 17939; RV64I-NEXT: .LBB120_2: # %atomicrmw.start 17940; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 17941; RV64I-NEXT: and a0, a1, s2 17942; RV64I-NEXT: mv a2, a1 17943; RV64I-NEXT: bltu s3, a0, .LBB120_1 17944; RV64I-NEXT: # %bb.3: # %atomicrmw.start 17945; RV64I-NEXT: # in Loop: Header=BB120_2 Depth=1 17946; RV64I-NEXT: mv a2, s0 17947; RV64I-NEXT: j .LBB120_1 17948; RV64I-NEXT: .LBB120_4: # %atomicrmw.end 17949; RV64I-NEXT: mv a0, a1 17950; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 17951; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 17952; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 17953; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 17954; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 17955; RV64I-NEXT: addi sp, sp, 48 17956; RV64I-NEXT: ret 17957; 17958; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i16_monotonic: 17959; RV64IA-NOZACAS: # %bb.0: 17960; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 17961; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 17962; RV64IA-NOZACAS-NEXT: lui a3, 16 17963; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 17964; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 17965; RV64IA-NOZACAS-NEXT: and a1, a1, a3 17966; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 17967; RV64IA-NOZACAS-NEXT: .LBB120_1: # =>This Inner Loop Header: Depth=1 17968; RV64IA-NOZACAS-NEXT: lr.w a3, (a2) 17969; RV64IA-NOZACAS-NEXT: and a6, a3, a4 17970; RV64IA-NOZACAS-NEXT: mv a5, a3 17971; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB120_3 17972; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB120_1 Depth=1 17973; RV64IA-NOZACAS-NEXT: xor a5, a3, a1 17974; RV64IA-NOZACAS-NEXT: and a5, a5, a4 17975; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 17976; RV64IA-NOZACAS-NEXT: .LBB120_3: # in Loop: Header=BB120_1 Depth=1 17977; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 17978; RV64IA-NOZACAS-NEXT: bnez a5, .LBB120_1 17979; RV64IA-NOZACAS-NEXT: # %bb.4: 17980; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 17981; RV64IA-NOZACAS-NEXT: ret 17982; 17983; RV64IA-ZACAS-LABEL: atomicrmw_umax_i16_monotonic: 17984; RV64IA-ZACAS: # %bb.0: 17985; RV64IA-ZACAS-NEXT: andi a2, a0, -4 17986; RV64IA-ZACAS-NEXT: slli a0, a0, 3 17987; RV64IA-ZACAS-NEXT: lui a3, 16 17988; RV64IA-ZACAS-NEXT: addi a3, a3, -1 17989; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 17990; RV64IA-ZACAS-NEXT: and a1, a1, a3 17991; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 17992; RV64IA-ZACAS-NEXT: .LBB120_1: # =>This Inner Loop Header: Depth=1 17993; RV64IA-ZACAS-NEXT: lr.w a3, (a2) 17994; RV64IA-ZACAS-NEXT: and a6, a3, a4 17995; RV64IA-ZACAS-NEXT: mv a5, a3 17996; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB120_3 17997; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB120_1 Depth=1 17998; RV64IA-ZACAS-NEXT: xor a5, a3, a1 17999; RV64IA-ZACAS-NEXT: and a5, a5, a4 18000; RV64IA-ZACAS-NEXT: xor a5, a3, a5 18001; RV64IA-ZACAS-NEXT: .LBB120_3: # in Loop: Header=BB120_1 Depth=1 18002; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 18003; RV64IA-ZACAS-NEXT: bnez a5, .LBB120_1 18004; RV64IA-ZACAS-NEXT: # %bb.4: 18005; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 18006; RV64IA-ZACAS-NEXT: ret 18007; 18008; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_monotonic: 18009; RV64IA-WMO-ZABHA: # %bb.0: 18010; RV64IA-WMO-ZABHA-NEXT: amomaxu.h a0, a1, (a0) 18011; RV64IA-WMO-ZABHA-NEXT: ret 18012; 18013; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_monotonic: 18014; RV64IA-TSO-ZABHA: # %bb.0: 18015; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0) 18016; RV64IA-TSO-ZABHA-NEXT: ret 18017 %1 = atomicrmw umax ptr %a, i16 %b monotonic 18018 ret i16 %1 18019} 18020 18021define i16 @atomicrmw_umax_i16_acquire(ptr %a, i16 %b) nounwind { 18022; RV32I-LABEL: atomicrmw_umax_i16_acquire: 18023; RV32I: # %bb.0: 18024; RV32I-NEXT: addi sp, sp, -32 18025; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 18026; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 18027; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 18028; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 18029; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 18030; RV32I-NEXT: mv s0, a1 18031; RV32I-NEXT: mv s1, a0 18032; RV32I-NEXT: lhu a1, 0(a0) 18033; RV32I-NEXT: lui s2, 16 18034; RV32I-NEXT: addi s2, s2, -1 18035; RV32I-NEXT: and s3, s0, s2 18036; RV32I-NEXT: j .LBB121_2 18037; RV32I-NEXT: .LBB121_1: # %atomicrmw.start 18038; RV32I-NEXT: # in Loop: Header=BB121_2 Depth=1 18039; RV32I-NEXT: sh a1, 10(sp) 18040; RV32I-NEXT: addi a1, sp, 10 18041; RV32I-NEXT: li a3, 2 18042; RV32I-NEXT: li a4, 2 18043; RV32I-NEXT: mv a0, s1 18044; RV32I-NEXT: call __atomic_compare_exchange_2 18045; RV32I-NEXT: lh a1, 10(sp) 18046; RV32I-NEXT: bnez a0, .LBB121_4 18047; RV32I-NEXT: .LBB121_2: # %atomicrmw.start 18048; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 18049; RV32I-NEXT: and a0, a1, s2 18050; RV32I-NEXT: mv a2, a1 18051; RV32I-NEXT: bltu s3, a0, .LBB121_1 18052; RV32I-NEXT: # %bb.3: # %atomicrmw.start 18053; RV32I-NEXT: # in Loop: Header=BB121_2 Depth=1 18054; RV32I-NEXT: mv a2, s0 18055; RV32I-NEXT: j .LBB121_1 18056; RV32I-NEXT: .LBB121_4: # %atomicrmw.end 18057; RV32I-NEXT: mv a0, a1 18058; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 18059; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 18060; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 18061; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 18062; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 18063; RV32I-NEXT: addi sp, sp, 32 18064; RV32I-NEXT: ret 18065; 18066; RV32IA-WMO-LABEL: atomicrmw_umax_i16_acquire: 18067; RV32IA-WMO: # %bb.0: 18068; RV32IA-WMO-NEXT: andi a2, a0, -4 18069; RV32IA-WMO-NEXT: slli a0, a0, 3 18070; RV32IA-WMO-NEXT: lui a3, 16 18071; RV32IA-WMO-NEXT: addi a3, a3, -1 18072; RV32IA-WMO-NEXT: sll a4, a3, a0 18073; RV32IA-WMO-NEXT: and a1, a1, a3 18074; RV32IA-WMO-NEXT: sll a1, a1, a0 18075; RV32IA-WMO-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1 18076; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 18077; RV32IA-WMO-NEXT: and a6, a3, a4 18078; RV32IA-WMO-NEXT: mv a5, a3 18079; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB121_3 18080; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1 18081; RV32IA-WMO-NEXT: xor a5, a3, a1 18082; RV32IA-WMO-NEXT: and a5, a5, a4 18083; RV32IA-WMO-NEXT: xor a5, a3, a5 18084; RV32IA-WMO-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1 18085; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 18086; RV32IA-WMO-NEXT: bnez a5, .LBB121_1 18087; RV32IA-WMO-NEXT: # %bb.4: 18088; RV32IA-WMO-NEXT: srl a0, a3, a0 18089; RV32IA-WMO-NEXT: ret 18090; 18091; RV32IA-TSO-LABEL: atomicrmw_umax_i16_acquire: 18092; RV32IA-TSO: # %bb.0: 18093; RV32IA-TSO-NEXT: andi a2, a0, -4 18094; RV32IA-TSO-NEXT: slli a0, a0, 3 18095; RV32IA-TSO-NEXT: lui a3, 16 18096; RV32IA-TSO-NEXT: addi a3, a3, -1 18097; RV32IA-TSO-NEXT: sll a4, a3, a0 18098; RV32IA-TSO-NEXT: and a1, a1, a3 18099; RV32IA-TSO-NEXT: sll a1, a1, a0 18100; RV32IA-TSO-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1 18101; RV32IA-TSO-NEXT: lr.w a3, (a2) 18102; RV32IA-TSO-NEXT: and a6, a3, a4 18103; RV32IA-TSO-NEXT: mv a5, a3 18104; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB121_3 18105; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1 18106; RV32IA-TSO-NEXT: xor a5, a3, a1 18107; RV32IA-TSO-NEXT: and a5, a5, a4 18108; RV32IA-TSO-NEXT: xor a5, a3, a5 18109; RV32IA-TSO-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1 18110; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 18111; RV32IA-TSO-NEXT: bnez a5, .LBB121_1 18112; RV32IA-TSO-NEXT: # %bb.4: 18113; RV32IA-TSO-NEXT: srl a0, a3, a0 18114; RV32IA-TSO-NEXT: ret 18115; 18116; RV64I-LABEL: atomicrmw_umax_i16_acquire: 18117; RV64I: # %bb.0: 18118; RV64I-NEXT: addi sp, sp, -48 18119; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 18120; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 18121; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 18122; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 18123; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 18124; RV64I-NEXT: mv s0, a1 18125; RV64I-NEXT: mv s1, a0 18126; RV64I-NEXT: lhu a1, 0(a0) 18127; RV64I-NEXT: lui s2, 16 18128; RV64I-NEXT: addiw s2, s2, -1 18129; RV64I-NEXT: and s3, s0, s2 18130; RV64I-NEXT: j .LBB121_2 18131; RV64I-NEXT: .LBB121_1: # %atomicrmw.start 18132; RV64I-NEXT: # in Loop: Header=BB121_2 Depth=1 18133; RV64I-NEXT: sh a1, 6(sp) 18134; RV64I-NEXT: addi a1, sp, 6 18135; RV64I-NEXT: li a3, 2 18136; RV64I-NEXT: li a4, 2 18137; RV64I-NEXT: mv a0, s1 18138; RV64I-NEXT: call __atomic_compare_exchange_2 18139; RV64I-NEXT: lh a1, 6(sp) 18140; RV64I-NEXT: bnez a0, .LBB121_4 18141; RV64I-NEXT: .LBB121_2: # %atomicrmw.start 18142; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 18143; RV64I-NEXT: and a0, a1, s2 18144; RV64I-NEXT: mv a2, a1 18145; RV64I-NEXT: bltu s3, a0, .LBB121_1 18146; RV64I-NEXT: # %bb.3: # %atomicrmw.start 18147; RV64I-NEXT: # in Loop: Header=BB121_2 Depth=1 18148; RV64I-NEXT: mv a2, s0 18149; RV64I-NEXT: j .LBB121_1 18150; RV64I-NEXT: .LBB121_4: # %atomicrmw.end 18151; RV64I-NEXT: mv a0, a1 18152; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 18153; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 18154; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 18155; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 18156; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 18157; RV64I-NEXT: addi sp, sp, 48 18158; RV64I-NEXT: ret 18159; 18160; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_acquire: 18161; RV64IA-WMO-NOZACAS: # %bb.0: 18162; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 18163; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 18164; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 18165; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 18166; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 18167; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 18168; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 18169; RV64IA-WMO-NOZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1 18170; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 18171; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4 18172; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3 18173; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB121_3 18174; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1 18175; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1 18176; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 18177; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 18178; RV64IA-WMO-NOZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1 18179; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 18180; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB121_1 18181; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 18182; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 18183; RV64IA-WMO-NOZACAS-NEXT: ret 18184; 18185; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_acquire: 18186; RV64IA-TSO-NOZACAS: # %bb.0: 18187; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 18188; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 18189; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 18190; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 18191; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 18192; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 18193; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 18194; RV64IA-TSO-NOZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1 18195; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 18196; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4 18197; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3 18198; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB121_3 18199; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1 18200; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1 18201; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 18202; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 18203; RV64IA-TSO-NOZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1 18204; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 18205; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB121_1 18206; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 18207; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 18208; RV64IA-TSO-NOZACAS-NEXT: ret 18209; 18210; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_acquire: 18211; RV64IA-WMO-ZACAS: # %bb.0: 18212; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 18213; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 18214; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 18215; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 18216; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 18217; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 18218; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 18219; RV64IA-WMO-ZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1 18220; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 18221; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4 18222; RV64IA-WMO-ZACAS-NEXT: mv a5, a3 18223; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB121_3 18224; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1 18225; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1 18226; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 18227; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 18228; RV64IA-WMO-ZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1 18229; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 18230; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB121_1 18231; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 18232; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 18233; RV64IA-WMO-ZACAS-NEXT: ret 18234; 18235; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_acquire: 18236; RV64IA-TSO-ZACAS: # %bb.0: 18237; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 18238; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 18239; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 18240; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 18241; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 18242; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 18243; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 18244; RV64IA-TSO-ZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1 18245; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 18246; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4 18247; RV64IA-TSO-ZACAS-NEXT: mv a5, a3 18248; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB121_3 18249; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1 18250; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1 18251; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 18252; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 18253; RV64IA-TSO-ZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1 18254; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 18255; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB121_1 18256; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 18257; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 18258; RV64IA-TSO-ZACAS-NEXT: ret 18259; 18260; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_acquire: 18261; RV64IA-WMO-ZABHA: # %bb.0: 18262; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.aq a0, a1, (a0) 18263; RV64IA-WMO-ZABHA-NEXT: ret 18264; 18265; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_acquire: 18266; RV64IA-TSO-ZABHA: # %bb.0: 18267; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0) 18268; RV64IA-TSO-ZABHA-NEXT: ret 18269 %1 = atomicrmw umax ptr %a, i16 %b acquire 18270 ret i16 %1 18271} 18272 18273define i16 @atomicrmw_umax_i16_release(ptr %a, i16 %b) nounwind { 18274; RV32I-LABEL: atomicrmw_umax_i16_release: 18275; RV32I: # %bb.0: 18276; RV32I-NEXT: addi sp, sp, -32 18277; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 18278; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 18279; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 18280; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 18281; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 18282; RV32I-NEXT: mv s0, a1 18283; RV32I-NEXT: mv s1, a0 18284; RV32I-NEXT: lhu a1, 0(a0) 18285; RV32I-NEXT: lui s2, 16 18286; RV32I-NEXT: addi s2, s2, -1 18287; RV32I-NEXT: and s3, s0, s2 18288; RV32I-NEXT: j .LBB122_2 18289; RV32I-NEXT: .LBB122_1: # %atomicrmw.start 18290; RV32I-NEXT: # in Loop: Header=BB122_2 Depth=1 18291; RV32I-NEXT: sh a1, 10(sp) 18292; RV32I-NEXT: addi a1, sp, 10 18293; RV32I-NEXT: li a3, 3 18294; RV32I-NEXT: mv a0, s1 18295; RV32I-NEXT: li a4, 0 18296; RV32I-NEXT: call __atomic_compare_exchange_2 18297; RV32I-NEXT: lh a1, 10(sp) 18298; RV32I-NEXT: bnez a0, .LBB122_4 18299; RV32I-NEXT: .LBB122_2: # %atomicrmw.start 18300; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 18301; RV32I-NEXT: and a0, a1, s2 18302; RV32I-NEXT: mv a2, a1 18303; RV32I-NEXT: bltu s3, a0, .LBB122_1 18304; RV32I-NEXT: # %bb.3: # %atomicrmw.start 18305; RV32I-NEXT: # in Loop: Header=BB122_2 Depth=1 18306; RV32I-NEXT: mv a2, s0 18307; RV32I-NEXT: j .LBB122_1 18308; RV32I-NEXT: .LBB122_4: # %atomicrmw.end 18309; RV32I-NEXT: mv a0, a1 18310; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 18311; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 18312; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 18313; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 18314; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 18315; RV32I-NEXT: addi sp, sp, 32 18316; RV32I-NEXT: ret 18317; 18318; RV32IA-WMO-LABEL: atomicrmw_umax_i16_release: 18319; RV32IA-WMO: # %bb.0: 18320; RV32IA-WMO-NEXT: andi a2, a0, -4 18321; RV32IA-WMO-NEXT: slli a0, a0, 3 18322; RV32IA-WMO-NEXT: lui a3, 16 18323; RV32IA-WMO-NEXT: addi a3, a3, -1 18324; RV32IA-WMO-NEXT: sll a4, a3, a0 18325; RV32IA-WMO-NEXT: and a1, a1, a3 18326; RV32IA-WMO-NEXT: sll a1, a1, a0 18327; RV32IA-WMO-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1 18328; RV32IA-WMO-NEXT: lr.w a3, (a2) 18329; RV32IA-WMO-NEXT: and a6, a3, a4 18330; RV32IA-WMO-NEXT: mv a5, a3 18331; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB122_3 18332; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1 18333; RV32IA-WMO-NEXT: xor a5, a3, a1 18334; RV32IA-WMO-NEXT: and a5, a5, a4 18335; RV32IA-WMO-NEXT: xor a5, a3, a5 18336; RV32IA-WMO-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1 18337; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 18338; RV32IA-WMO-NEXT: bnez a5, .LBB122_1 18339; RV32IA-WMO-NEXT: # %bb.4: 18340; RV32IA-WMO-NEXT: srl a0, a3, a0 18341; RV32IA-WMO-NEXT: ret 18342; 18343; RV32IA-TSO-LABEL: atomicrmw_umax_i16_release: 18344; RV32IA-TSO: # %bb.0: 18345; RV32IA-TSO-NEXT: andi a2, a0, -4 18346; RV32IA-TSO-NEXT: slli a0, a0, 3 18347; RV32IA-TSO-NEXT: lui a3, 16 18348; RV32IA-TSO-NEXT: addi a3, a3, -1 18349; RV32IA-TSO-NEXT: sll a4, a3, a0 18350; RV32IA-TSO-NEXT: and a1, a1, a3 18351; RV32IA-TSO-NEXT: sll a1, a1, a0 18352; RV32IA-TSO-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1 18353; RV32IA-TSO-NEXT: lr.w a3, (a2) 18354; RV32IA-TSO-NEXT: and a6, a3, a4 18355; RV32IA-TSO-NEXT: mv a5, a3 18356; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB122_3 18357; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1 18358; RV32IA-TSO-NEXT: xor a5, a3, a1 18359; RV32IA-TSO-NEXT: and a5, a5, a4 18360; RV32IA-TSO-NEXT: xor a5, a3, a5 18361; RV32IA-TSO-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1 18362; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 18363; RV32IA-TSO-NEXT: bnez a5, .LBB122_1 18364; RV32IA-TSO-NEXT: # %bb.4: 18365; RV32IA-TSO-NEXT: srl a0, a3, a0 18366; RV32IA-TSO-NEXT: ret 18367; 18368; RV64I-LABEL: atomicrmw_umax_i16_release: 18369; RV64I: # %bb.0: 18370; RV64I-NEXT: addi sp, sp, -48 18371; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 18372; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 18373; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 18374; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 18375; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 18376; RV64I-NEXT: mv s0, a1 18377; RV64I-NEXT: mv s1, a0 18378; RV64I-NEXT: lhu a1, 0(a0) 18379; RV64I-NEXT: lui s2, 16 18380; RV64I-NEXT: addiw s2, s2, -1 18381; RV64I-NEXT: and s3, s0, s2 18382; RV64I-NEXT: j .LBB122_2 18383; RV64I-NEXT: .LBB122_1: # %atomicrmw.start 18384; RV64I-NEXT: # in Loop: Header=BB122_2 Depth=1 18385; RV64I-NEXT: sh a1, 6(sp) 18386; RV64I-NEXT: addi a1, sp, 6 18387; RV64I-NEXT: li a3, 3 18388; RV64I-NEXT: mv a0, s1 18389; RV64I-NEXT: li a4, 0 18390; RV64I-NEXT: call __atomic_compare_exchange_2 18391; RV64I-NEXT: lh a1, 6(sp) 18392; RV64I-NEXT: bnez a0, .LBB122_4 18393; RV64I-NEXT: .LBB122_2: # %atomicrmw.start 18394; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 18395; RV64I-NEXT: and a0, a1, s2 18396; RV64I-NEXT: mv a2, a1 18397; RV64I-NEXT: bltu s3, a0, .LBB122_1 18398; RV64I-NEXT: # %bb.3: # %atomicrmw.start 18399; RV64I-NEXT: # in Loop: Header=BB122_2 Depth=1 18400; RV64I-NEXT: mv a2, s0 18401; RV64I-NEXT: j .LBB122_1 18402; RV64I-NEXT: .LBB122_4: # %atomicrmw.end 18403; RV64I-NEXT: mv a0, a1 18404; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 18405; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 18406; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 18407; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 18408; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 18409; RV64I-NEXT: addi sp, sp, 48 18410; RV64I-NEXT: ret 18411; 18412; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_release: 18413; RV64IA-WMO-NOZACAS: # %bb.0: 18414; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 18415; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 18416; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 18417; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 18418; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 18419; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 18420; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 18421; RV64IA-WMO-NOZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1 18422; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2) 18423; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4 18424; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3 18425; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB122_3 18426; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1 18427; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1 18428; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 18429; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 18430; RV64IA-WMO-NOZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1 18431; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 18432; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB122_1 18433; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 18434; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 18435; RV64IA-WMO-NOZACAS-NEXT: ret 18436; 18437; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_release: 18438; RV64IA-TSO-NOZACAS: # %bb.0: 18439; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 18440; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 18441; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 18442; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 18443; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 18444; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 18445; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 18446; RV64IA-TSO-NOZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1 18447; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 18448; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4 18449; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3 18450; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB122_3 18451; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1 18452; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1 18453; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 18454; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 18455; RV64IA-TSO-NOZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1 18456; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 18457; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB122_1 18458; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 18459; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 18460; RV64IA-TSO-NOZACAS-NEXT: ret 18461; 18462; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_release: 18463; RV64IA-WMO-ZACAS: # %bb.0: 18464; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 18465; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 18466; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 18467; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 18468; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 18469; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 18470; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 18471; RV64IA-WMO-ZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1 18472; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2) 18473; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4 18474; RV64IA-WMO-ZACAS-NEXT: mv a5, a3 18475; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB122_3 18476; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1 18477; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1 18478; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 18479; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 18480; RV64IA-WMO-ZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1 18481; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 18482; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB122_1 18483; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 18484; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 18485; RV64IA-WMO-ZACAS-NEXT: ret 18486; 18487; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_release: 18488; RV64IA-TSO-ZACAS: # %bb.0: 18489; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 18490; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 18491; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 18492; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 18493; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 18494; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 18495; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 18496; RV64IA-TSO-ZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1 18497; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 18498; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4 18499; RV64IA-TSO-ZACAS-NEXT: mv a5, a3 18500; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB122_3 18501; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1 18502; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1 18503; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 18504; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 18505; RV64IA-TSO-ZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1 18506; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 18507; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB122_1 18508; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 18509; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 18510; RV64IA-TSO-ZACAS-NEXT: ret 18511; 18512; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_release: 18513; RV64IA-WMO-ZABHA: # %bb.0: 18514; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.rl a0, a1, (a0) 18515; RV64IA-WMO-ZABHA-NEXT: ret 18516; 18517; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_release: 18518; RV64IA-TSO-ZABHA: # %bb.0: 18519; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0) 18520; RV64IA-TSO-ZABHA-NEXT: ret 18521 %1 = atomicrmw umax ptr %a, i16 %b release 18522 ret i16 %1 18523} 18524 18525define i16 @atomicrmw_umax_i16_acq_rel(ptr %a, i16 %b) nounwind { 18526; RV32I-LABEL: atomicrmw_umax_i16_acq_rel: 18527; RV32I: # %bb.0: 18528; RV32I-NEXT: addi sp, sp, -32 18529; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 18530; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 18531; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 18532; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 18533; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 18534; RV32I-NEXT: mv s0, a1 18535; RV32I-NEXT: mv s1, a0 18536; RV32I-NEXT: lhu a1, 0(a0) 18537; RV32I-NEXT: lui s2, 16 18538; RV32I-NEXT: addi s2, s2, -1 18539; RV32I-NEXT: and s3, s0, s2 18540; RV32I-NEXT: j .LBB123_2 18541; RV32I-NEXT: .LBB123_1: # %atomicrmw.start 18542; RV32I-NEXT: # in Loop: Header=BB123_2 Depth=1 18543; RV32I-NEXT: sh a1, 10(sp) 18544; RV32I-NEXT: addi a1, sp, 10 18545; RV32I-NEXT: li a3, 4 18546; RV32I-NEXT: li a4, 2 18547; RV32I-NEXT: mv a0, s1 18548; RV32I-NEXT: call __atomic_compare_exchange_2 18549; RV32I-NEXT: lh a1, 10(sp) 18550; RV32I-NEXT: bnez a0, .LBB123_4 18551; RV32I-NEXT: .LBB123_2: # %atomicrmw.start 18552; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 18553; RV32I-NEXT: and a0, a1, s2 18554; RV32I-NEXT: mv a2, a1 18555; RV32I-NEXT: bltu s3, a0, .LBB123_1 18556; RV32I-NEXT: # %bb.3: # %atomicrmw.start 18557; RV32I-NEXT: # in Loop: Header=BB123_2 Depth=1 18558; RV32I-NEXT: mv a2, s0 18559; RV32I-NEXT: j .LBB123_1 18560; RV32I-NEXT: .LBB123_4: # %atomicrmw.end 18561; RV32I-NEXT: mv a0, a1 18562; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 18563; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 18564; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 18565; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 18566; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 18567; RV32I-NEXT: addi sp, sp, 32 18568; RV32I-NEXT: ret 18569; 18570; RV32IA-WMO-LABEL: atomicrmw_umax_i16_acq_rel: 18571; RV32IA-WMO: # %bb.0: 18572; RV32IA-WMO-NEXT: andi a2, a0, -4 18573; RV32IA-WMO-NEXT: slli a0, a0, 3 18574; RV32IA-WMO-NEXT: lui a3, 16 18575; RV32IA-WMO-NEXT: addi a3, a3, -1 18576; RV32IA-WMO-NEXT: sll a4, a3, a0 18577; RV32IA-WMO-NEXT: and a1, a1, a3 18578; RV32IA-WMO-NEXT: sll a1, a1, a0 18579; RV32IA-WMO-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1 18580; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 18581; RV32IA-WMO-NEXT: and a6, a3, a4 18582; RV32IA-WMO-NEXT: mv a5, a3 18583; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB123_3 18584; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1 18585; RV32IA-WMO-NEXT: xor a5, a3, a1 18586; RV32IA-WMO-NEXT: and a5, a5, a4 18587; RV32IA-WMO-NEXT: xor a5, a3, a5 18588; RV32IA-WMO-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1 18589; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 18590; RV32IA-WMO-NEXT: bnez a5, .LBB123_1 18591; RV32IA-WMO-NEXT: # %bb.4: 18592; RV32IA-WMO-NEXT: srl a0, a3, a0 18593; RV32IA-WMO-NEXT: ret 18594; 18595; RV32IA-TSO-LABEL: atomicrmw_umax_i16_acq_rel: 18596; RV32IA-TSO: # %bb.0: 18597; RV32IA-TSO-NEXT: andi a2, a0, -4 18598; RV32IA-TSO-NEXT: slli a0, a0, 3 18599; RV32IA-TSO-NEXT: lui a3, 16 18600; RV32IA-TSO-NEXT: addi a3, a3, -1 18601; RV32IA-TSO-NEXT: sll a4, a3, a0 18602; RV32IA-TSO-NEXT: and a1, a1, a3 18603; RV32IA-TSO-NEXT: sll a1, a1, a0 18604; RV32IA-TSO-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1 18605; RV32IA-TSO-NEXT: lr.w a3, (a2) 18606; RV32IA-TSO-NEXT: and a6, a3, a4 18607; RV32IA-TSO-NEXT: mv a5, a3 18608; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB123_3 18609; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1 18610; RV32IA-TSO-NEXT: xor a5, a3, a1 18611; RV32IA-TSO-NEXT: and a5, a5, a4 18612; RV32IA-TSO-NEXT: xor a5, a3, a5 18613; RV32IA-TSO-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1 18614; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 18615; RV32IA-TSO-NEXT: bnez a5, .LBB123_1 18616; RV32IA-TSO-NEXT: # %bb.4: 18617; RV32IA-TSO-NEXT: srl a0, a3, a0 18618; RV32IA-TSO-NEXT: ret 18619; 18620; RV64I-LABEL: atomicrmw_umax_i16_acq_rel: 18621; RV64I: # %bb.0: 18622; RV64I-NEXT: addi sp, sp, -48 18623; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 18624; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 18625; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 18626; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 18627; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 18628; RV64I-NEXT: mv s0, a1 18629; RV64I-NEXT: mv s1, a0 18630; RV64I-NEXT: lhu a1, 0(a0) 18631; RV64I-NEXT: lui s2, 16 18632; RV64I-NEXT: addiw s2, s2, -1 18633; RV64I-NEXT: and s3, s0, s2 18634; RV64I-NEXT: j .LBB123_2 18635; RV64I-NEXT: .LBB123_1: # %atomicrmw.start 18636; RV64I-NEXT: # in Loop: Header=BB123_2 Depth=1 18637; RV64I-NEXT: sh a1, 6(sp) 18638; RV64I-NEXT: addi a1, sp, 6 18639; RV64I-NEXT: li a3, 4 18640; RV64I-NEXT: li a4, 2 18641; RV64I-NEXT: mv a0, s1 18642; RV64I-NEXT: call __atomic_compare_exchange_2 18643; RV64I-NEXT: lh a1, 6(sp) 18644; RV64I-NEXT: bnez a0, .LBB123_4 18645; RV64I-NEXT: .LBB123_2: # %atomicrmw.start 18646; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 18647; RV64I-NEXT: and a0, a1, s2 18648; RV64I-NEXT: mv a2, a1 18649; RV64I-NEXT: bltu s3, a0, .LBB123_1 18650; RV64I-NEXT: # %bb.3: # %atomicrmw.start 18651; RV64I-NEXT: # in Loop: Header=BB123_2 Depth=1 18652; RV64I-NEXT: mv a2, s0 18653; RV64I-NEXT: j .LBB123_1 18654; RV64I-NEXT: .LBB123_4: # %atomicrmw.end 18655; RV64I-NEXT: mv a0, a1 18656; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 18657; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 18658; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 18659; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 18660; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 18661; RV64I-NEXT: addi sp, sp, 48 18662; RV64I-NEXT: ret 18663; 18664; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_acq_rel: 18665; RV64IA-WMO-NOZACAS: # %bb.0: 18666; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 18667; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 18668; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 18669; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 18670; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 18671; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 18672; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 18673; RV64IA-WMO-NOZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1 18674; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 18675; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4 18676; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3 18677; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB123_3 18678; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1 18679; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1 18680; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 18681; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 18682; RV64IA-WMO-NOZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1 18683; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 18684; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB123_1 18685; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 18686; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 18687; RV64IA-WMO-NOZACAS-NEXT: ret 18688; 18689; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_acq_rel: 18690; RV64IA-TSO-NOZACAS: # %bb.0: 18691; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 18692; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 18693; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 18694; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 18695; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 18696; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 18697; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 18698; RV64IA-TSO-NOZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1 18699; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 18700; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4 18701; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3 18702; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB123_3 18703; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1 18704; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1 18705; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 18706; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 18707; RV64IA-TSO-NOZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1 18708; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 18709; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB123_1 18710; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 18711; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 18712; RV64IA-TSO-NOZACAS-NEXT: ret 18713; 18714; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_acq_rel: 18715; RV64IA-WMO-ZACAS: # %bb.0: 18716; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 18717; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 18718; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 18719; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 18720; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 18721; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 18722; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 18723; RV64IA-WMO-ZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1 18724; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 18725; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4 18726; RV64IA-WMO-ZACAS-NEXT: mv a5, a3 18727; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB123_3 18728; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1 18729; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1 18730; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 18731; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 18732; RV64IA-WMO-ZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1 18733; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 18734; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB123_1 18735; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 18736; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 18737; RV64IA-WMO-ZACAS-NEXT: ret 18738; 18739; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_acq_rel: 18740; RV64IA-TSO-ZACAS: # %bb.0: 18741; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 18742; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 18743; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 18744; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 18745; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 18746; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 18747; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 18748; RV64IA-TSO-ZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1 18749; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 18750; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4 18751; RV64IA-TSO-ZACAS-NEXT: mv a5, a3 18752; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB123_3 18753; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1 18754; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1 18755; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 18756; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 18757; RV64IA-TSO-ZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1 18758; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 18759; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB123_1 18760; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 18761; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 18762; RV64IA-TSO-ZACAS-NEXT: ret 18763; 18764; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_acq_rel: 18765; RV64IA-WMO-ZABHA: # %bb.0: 18766; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.aqrl a0, a1, (a0) 18767; RV64IA-WMO-ZABHA-NEXT: ret 18768; 18769; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_acq_rel: 18770; RV64IA-TSO-ZABHA: # %bb.0: 18771; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0) 18772; RV64IA-TSO-ZABHA-NEXT: ret 18773 %1 = atomicrmw umax ptr %a, i16 %b acq_rel 18774 ret i16 %1 18775} 18776 18777define i16 @atomicrmw_umax_i16_seq_cst(ptr %a, i16 %b) nounwind { 18778; RV32I-LABEL: atomicrmw_umax_i16_seq_cst: 18779; RV32I: # %bb.0: 18780; RV32I-NEXT: addi sp, sp, -32 18781; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 18782; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 18783; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 18784; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 18785; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 18786; RV32I-NEXT: mv s0, a1 18787; RV32I-NEXT: mv s1, a0 18788; RV32I-NEXT: lhu a1, 0(a0) 18789; RV32I-NEXT: lui s2, 16 18790; RV32I-NEXT: addi s2, s2, -1 18791; RV32I-NEXT: and s3, s0, s2 18792; RV32I-NEXT: j .LBB124_2 18793; RV32I-NEXT: .LBB124_1: # %atomicrmw.start 18794; RV32I-NEXT: # in Loop: Header=BB124_2 Depth=1 18795; RV32I-NEXT: sh a1, 10(sp) 18796; RV32I-NEXT: addi a1, sp, 10 18797; RV32I-NEXT: li a3, 5 18798; RV32I-NEXT: li a4, 5 18799; RV32I-NEXT: mv a0, s1 18800; RV32I-NEXT: call __atomic_compare_exchange_2 18801; RV32I-NEXT: lh a1, 10(sp) 18802; RV32I-NEXT: bnez a0, .LBB124_4 18803; RV32I-NEXT: .LBB124_2: # %atomicrmw.start 18804; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 18805; RV32I-NEXT: and a0, a1, s2 18806; RV32I-NEXT: mv a2, a1 18807; RV32I-NEXT: bltu s3, a0, .LBB124_1 18808; RV32I-NEXT: # %bb.3: # %atomicrmw.start 18809; RV32I-NEXT: # in Loop: Header=BB124_2 Depth=1 18810; RV32I-NEXT: mv a2, s0 18811; RV32I-NEXT: j .LBB124_1 18812; RV32I-NEXT: .LBB124_4: # %atomicrmw.end 18813; RV32I-NEXT: mv a0, a1 18814; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 18815; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 18816; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 18817; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 18818; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 18819; RV32I-NEXT: addi sp, sp, 32 18820; RV32I-NEXT: ret 18821; 18822; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst: 18823; RV32IA: # %bb.0: 18824; RV32IA-NEXT: andi a2, a0, -4 18825; RV32IA-NEXT: slli a0, a0, 3 18826; RV32IA-NEXT: lui a3, 16 18827; RV32IA-NEXT: addi a3, a3, -1 18828; RV32IA-NEXT: sll a4, a3, a0 18829; RV32IA-NEXT: and a1, a1, a3 18830; RV32IA-NEXT: sll a1, a1, a0 18831; RV32IA-NEXT: .LBB124_1: # =>This Inner Loop Header: Depth=1 18832; RV32IA-NEXT: lr.w.aqrl a3, (a2) 18833; RV32IA-NEXT: and a6, a3, a4 18834; RV32IA-NEXT: mv a5, a3 18835; RV32IA-NEXT: bgeu a6, a1, .LBB124_3 18836; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB124_1 Depth=1 18837; RV32IA-NEXT: xor a5, a3, a1 18838; RV32IA-NEXT: and a5, a5, a4 18839; RV32IA-NEXT: xor a5, a3, a5 18840; RV32IA-NEXT: .LBB124_3: # in Loop: Header=BB124_1 Depth=1 18841; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 18842; RV32IA-NEXT: bnez a5, .LBB124_1 18843; RV32IA-NEXT: # %bb.4: 18844; RV32IA-NEXT: srl a0, a3, a0 18845; RV32IA-NEXT: ret 18846; 18847; RV64I-LABEL: atomicrmw_umax_i16_seq_cst: 18848; RV64I: # %bb.0: 18849; RV64I-NEXT: addi sp, sp, -48 18850; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 18851; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 18852; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 18853; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 18854; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 18855; RV64I-NEXT: mv s0, a1 18856; RV64I-NEXT: mv s1, a0 18857; RV64I-NEXT: lhu a1, 0(a0) 18858; RV64I-NEXT: lui s2, 16 18859; RV64I-NEXT: addiw s2, s2, -1 18860; RV64I-NEXT: and s3, s0, s2 18861; RV64I-NEXT: j .LBB124_2 18862; RV64I-NEXT: .LBB124_1: # %atomicrmw.start 18863; RV64I-NEXT: # in Loop: Header=BB124_2 Depth=1 18864; RV64I-NEXT: sh a1, 6(sp) 18865; RV64I-NEXT: addi a1, sp, 6 18866; RV64I-NEXT: li a3, 5 18867; RV64I-NEXT: li a4, 5 18868; RV64I-NEXT: mv a0, s1 18869; RV64I-NEXT: call __atomic_compare_exchange_2 18870; RV64I-NEXT: lh a1, 6(sp) 18871; RV64I-NEXT: bnez a0, .LBB124_4 18872; RV64I-NEXT: .LBB124_2: # %atomicrmw.start 18873; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 18874; RV64I-NEXT: and a0, a1, s2 18875; RV64I-NEXT: mv a2, a1 18876; RV64I-NEXT: bltu s3, a0, .LBB124_1 18877; RV64I-NEXT: # %bb.3: # %atomicrmw.start 18878; RV64I-NEXT: # in Loop: Header=BB124_2 Depth=1 18879; RV64I-NEXT: mv a2, s0 18880; RV64I-NEXT: j .LBB124_1 18881; RV64I-NEXT: .LBB124_4: # %atomicrmw.end 18882; RV64I-NEXT: mv a0, a1 18883; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 18884; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 18885; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 18886; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 18887; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 18888; RV64I-NEXT: addi sp, sp, 48 18889; RV64I-NEXT: ret 18890; 18891; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i16_seq_cst: 18892; RV64IA-NOZACAS: # %bb.0: 18893; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 18894; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 18895; RV64IA-NOZACAS-NEXT: lui a3, 16 18896; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 18897; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 18898; RV64IA-NOZACAS-NEXT: and a1, a1, a3 18899; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 18900; RV64IA-NOZACAS-NEXT: .LBB124_1: # =>This Inner Loop Header: Depth=1 18901; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 18902; RV64IA-NOZACAS-NEXT: and a6, a3, a4 18903; RV64IA-NOZACAS-NEXT: mv a5, a3 18904; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB124_3 18905; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB124_1 Depth=1 18906; RV64IA-NOZACAS-NEXT: xor a5, a3, a1 18907; RV64IA-NOZACAS-NEXT: and a5, a5, a4 18908; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 18909; RV64IA-NOZACAS-NEXT: .LBB124_3: # in Loop: Header=BB124_1 Depth=1 18910; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 18911; RV64IA-NOZACAS-NEXT: bnez a5, .LBB124_1 18912; RV64IA-NOZACAS-NEXT: # %bb.4: 18913; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 18914; RV64IA-NOZACAS-NEXT: ret 18915; 18916; RV64IA-ZACAS-LABEL: atomicrmw_umax_i16_seq_cst: 18917; RV64IA-ZACAS: # %bb.0: 18918; RV64IA-ZACAS-NEXT: andi a2, a0, -4 18919; RV64IA-ZACAS-NEXT: slli a0, a0, 3 18920; RV64IA-ZACAS-NEXT: lui a3, 16 18921; RV64IA-ZACAS-NEXT: addi a3, a3, -1 18922; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 18923; RV64IA-ZACAS-NEXT: and a1, a1, a3 18924; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 18925; RV64IA-ZACAS-NEXT: .LBB124_1: # =>This Inner Loop Header: Depth=1 18926; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2) 18927; RV64IA-ZACAS-NEXT: and a6, a3, a4 18928; RV64IA-ZACAS-NEXT: mv a5, a3 18929; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB124_3 18930; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB124_1 Depth=1 18931; RV64IA-ZACAS-NEXT: xor a5, a3, a1 18932; RV64IA-ZACAS-NEXT: and a5, a5, a4 18933; RV64IA-ZACAS-NEXT: xor a5, a3, a5 18934; RV64IA-ZACAS-NEXT: .LBB124_3: # in Loop: Header=BB124_1 Depth=1 18935; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 18936; RV64IA-ZACAS-NEXT: bnez a5, .LBB124_1 18937; RV64IA-ZACAS-NEXT: # %bb.4: 18938; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 18939; RV64IA-ZACAS-NEXT: ret 18940; 18941; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_seq_cst: 18942; RV64IA-WMO-ZABHA: # %bb.0: 18943; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.aqrl a0, a1, (a0) 18944; RV64IA-WMO-ZABHA-NEXT: ret 18945; 18946; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_seq_cst: 18947; RV64IA-TSO-ZABHA: # %bb.0: 18948; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0) 18949; RV64IA-TSO-ZABHA-NEXT: ret 18950 %1 = atomicrmw umax ptr %a, i16 %b seq_cst 18951 ret i16 %1 18952} 18953 18954define i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind { 18955; RV32I-LABEL: atomicrmw_umin_i16_monotonic: 18956; RV32I: # %bb.0: 18957; RV32I-NEXT: addi sp, sp, -32 18958; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 18959; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 18960; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 18961; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 18962; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 18963; RV32I-NEXT: mv s0, a1 18964; RV32I-NEXT: mv s1, a0 18965; RV32I-NEXT: lhu a1, 0(a0) 18966; RV32I-NEXT: lui s2, 16 18967; RV32I-NEXT: addi s2, s2, -1 18968; RV32I-NEXT: and s3, s0, s2 18969; RV32I-NEXT: j .LBB125_2 18970; RV32I-NEXT: .LBB125_1: # %atomicrmw.start 18971; RV32I-NEXT: # in Loop: Header=BB125_2 Depth=1 18972; RV32I-NEXT: sh a1, 10(sp) 18973; RV32I-NEXT: addi a1, sp, 10 18974; RV32I-NEXT: mv a0, s1 18975; RV32I-NEXT: li a3, 0 18976; RV32I-NEXT: li a4, 0 18977; RV32I-NEXT: call __atomic_compare_exchange_2 18978; RV32I-NEXT: lh a1, 10(sp) 18979; RV32I-NEXT: bnez a0, .LBB125_4 18980; RV32I-NEXT: .LBB125_2: # %atomicrmw.start 18981; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 18982; RV32I-NEXT: and a0, a1, s2 18983; RV32I-NEXT: mv a2, a1 18984; RV32I-NEXT: bgeu s3, a0, .LBB125_1 18985; RV32I-NEXT: # %bb.3: # %atomicrmw.start 18986; RV32I-NEXT: # in Loop: Header=BB125_2 Depth=1 18987; RV32I-NEXT: mv a2, s0 18988; RV32I-NEXT: j .LBB125_1 18989; RV32I-NEXT: .LBB125_4: # %atomicrmw.end 18990; RV32I-NEXT: mv a0, a1 18991; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 18992; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 18993; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 18994; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 18995; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 18996; RV32I-NEXT: addi sp, sp, 32 18997; RV32I-NEXT: ret 18998; 18999; RV32IA-LABEL: atomicrmw_umin_i16_monotonic: 19000; RV32IA: # %bb.0: 19001; RV32IA-NEXT: andi a2, a0, -4 19002; RV32IA-NEXT: slli a0, a0, 3 19003; RV32IA-NEXT: lui a3, 16 19004; RV32IA-NEXT: addi a3, a3, -1 19005; RV32IA-NEXT: sll a4, a3, a0 19006; RV32IA-NEXT: and a1, a1, a3 19007; RV32IA-NEXT: sll a1, a1, a0 19008; RV32IA-NEXT: .LBB125_1: # =>This Inner Loop Header: Depth=1 19009; RV32IA-NEXT: lr.w a3, (a2) 19010; RV32IA-NEXT: and a6, a3, a4 19011; RV32IA-NEXT: mv a5, a3 19012; RV32IA-NEXT: bgeu a1, a6, .LBB125_3 19013; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB125_1 Depth=1 19014; RV32IA-NEXT: xor a5, a3, a1 19015; RV32IA-NEXT: and a5, a5, a4 19016; RV32IA-NEXT: xor a5, a3, a5 19017; RV32IA-NEXT: .LBB125_3: # in Loop: Header=BB125_1 Depth=1 19018; RV32IA-NEXT: sc.w a5, a5, (a2) 19019; RV32IA-NEXT: bnez a5, .LBB125_1 19020; RV32IA-NEXT: # %bb.4: 19021; RV32IA-NEXT: srl a0, a3, a0 19022; RV32IA-NEXT: ret 19023; 19024; RV64I-LABEL: atomicrmw_umin_i16_monotonic: 19025; RV64I: # %bb.0: 19026; RV64I-NEXT: addi sp, sp, -48 19027; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 19028; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 19029; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 19030; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 19031; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 19032; RV64I-NEXT: mv s0, a1 19033; RV64I-NEXT: mv s1, a0 19034; RV64I-NEXT: lhu a1, 0(a0) 19035; RV64I-NEXT: lui s2, 16 19036; RV64I-NEXT: addiw s2, s2, -1 19037; RV64I-NEXT: and s3, s0, s2 19038; RV64I-NEXT: j .LBB125_2 19039; RV64I-NEXT: .LBB125_1: # %atomicrmw.start 19040; RV64I-NEXT: # in Loop: Header=BB125_2 Depth=1 19041; RV64I-NEXT: sh a1, 6(sp) 19042; RV64I-NEXT: addi a1, sp, 6 19043; RV64I-NEXT: mv a0, s1 19044; RV64I-NEXT: li a3, 0 19045; RV64I-NEXT: li a4, 0 19046; RV64I-NEXT: call __atomic_compare_exchange_2 19047; RV64I-NEXT: lh a1, 6(sp) 19048; RV64I-NEXT: bnez a0, .LBB125_4 19049; RV64I-NEXT: .LBB125_2: # %atomicrmw.start 19050; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 19051; RV64I-NEXT: and a0, a1, s2 19052; RV64I-NEXT: mv a2, a1 19053; RV64I-NEXT: bgeu s3, a0, .LBB125_1 19054; RV64I-NEXT: # %bb.3: # %atomicrmw.start 19055; RV64I-NEXT: # in Loop: Header=BB125_2 Depth=1 19056; RV64I-NEXT: mv a2, s0 19057; RV64I-NEXT: j .LBB125_1 19058; RV64I-NEXT: .LBB125_4: # %atomicrmw.end 19059; RV64I-NEXT: mv a0, a1 19060; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 19061; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 19062; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 19063; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 19064; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 19065; RV64I-NEXT: addi sp, sp, 48 19066; RV64I-NEXT: ret 19067; 19068; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i16_monotonic: 19069; RV64IA-NOZACAS: # %bb.0: 19070; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 19071; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 19072; RV64IA-NOZACAS-NEXT: lui a3, 16 19073; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 19074; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 19075; RV64IA-NOZACAS-NEXT: and a1, a1, a3 19076; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 19077; RV64IA-NOZACAS-NEXT: .LBB125_1: # =>This Inner Loop Header: Depth=1 19078; RV64IA-NOZACAS-NEXT: lr.w a3, (a2) 19079; RV64IA-NOZACAS-NEXT: and a6, a3, a4 19080; RV64IA-NOZACAS-NEXT: mv a5, a3 19081; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB125_3 19082; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB125_1 Depth=1 19083; RV64IA-NOZACAS-NEXT: xor a5, a3, a1 19084; RV64IA-NOZACAS-NEXT: and a5, a5, a4 19085; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 19086; RV64IA-NOZACAS-NEXT: .LBB125_3: # in Loop: Header=BB125_1 Depth=1 19087; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2) 19088; RV64IA-NOZACAS-NEXT: bnez a5, .LBB125_1 19089; RV64IA-NOZACAS-NEXT: # %bb.4: 19090; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 19091; RV64IA-NOZACAS-NEXT: ret 19092; 19093; RV64IA-ZACAS-LABEL: atomicrmw_umin_i16_monotonic: 19094; RV64IA-ZACAS: # %bb.0: 19095; RV64IA-ZACAS-NEXT: andi a2, a0, -4 19096; RV64IA-ZACAS-NEXT: slli a0, a0, 3 19097; RV64IA-ZACAS-NEXT: lui a3, 16 19098; RV64IA-ZACAS-NEXT: addi a3, a3, -1 19099; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 19100; RV64IA-ZACAS-NEXT: and a1, a1, a3 19101; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 19102; RV64IA-ZACAS-NEXT: .LBB125_1: # =>This Inner Loop Header: Depth=1 19103; RV64IA-ZACAS-NEXT: lr.w a3, (a2) 19104; RV64IA-ZACAS-NEXT: and a6, a3, a4 19105; RV64IA-ZACAS-NEXT: mv a5, a3 19106; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB125_3 19107; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB125_1 Depth=1 19108; RV64IA-ZACAS-NEXT: xor a5, a3, a1 19109; RV64IA-ZACAS-NEXT: and a5, a5, a4 19110; RV64IA-ZACAS-NEXT: xor a5, a3, a5 19111; RV64IA-ZACAS-NEXT: .LBB125_3: # in Loop: Header=BB125_1 Depth=1 19112; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2) 19113; RV64IA-ZACAS-NEXT: bnez a5, .LBB125_1 19114; RV64IA-ZACAS-NEXT: # %bb.4: 19115; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 19116; RV64IA-ZACAS-NEXT: ret 19117; 19118; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_monotonic: 19119; RV64IA-WMO-ZABHA: # %bb.0: 19120; RV64IA-WMO-ZABHA-NEXT: amominu.h a0, a1, (a0) 19121; RV64IA-WMO-ZABHA-NEXT: ret 19122; 19123; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_monotonic: 19124; RV64IA-TSO-ZABHA: # %bb.0: 19125; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0) 19126; RV64IA-TSO-ZABHA-NEXT: ret 19127 %1 = atomicrmw umin ptr %a, i16 %b monotonic 19128 ret i16 %1 19129} 19130 19131define i16 @atomicrmw_umin_i16_acquire(ptr %a, i16 %b) nounwind { 19132; RV32I-LABEL: atomicrmw_umin_i16_acquire: 19133; RV32I: # %bb.0: 19134; RV32I-NEXT: addi sp, sp, -32 19135; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 19136; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 19137; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 19138; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 19139; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 19140; RV32I-NEXT: mv s0, a1 19141; RV32I-NEXT: mv s1, a0 19142; RV32I-NEXT: lhu a1, 0(a0) 19143; RV32I-NEXT: lui s2, 16 19144; RV32I-NEXT: addi s2, s2, -1 19145; RV32I-NEXT: and s3, s0, s2 19146; RV32I-NEXT: j .LBB126_2 19147; RV32I-NEXT: .LBB126_1: # %atomicrmw.start 19148; RV32I-NEXT: # in Loop: Header=BB126_2 Depth=1 19149; RV32I-NEXT: sh a1, 10(sp) 19150; RV32I-NEXT: addi a1, sp, 10 19151; RV32I-NEXT: li a3, 2 19152; RV32I-NEXT: li a4, 2 19153; RV32I-NEXT: mv a0, s1 19154; RV32I-NEXT: call __atomic_compare_exchange_2 19155; RV32I-NEXT: lh a1, 10(sp) 19156; RV32I-NEXT: bnez a0, .LBB126_4 19157; RV32I-NEXT: .LBB126_2: # %atomicrmw.start 19158; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 19159; RV32I-NEXT: and a0, a1, s2 19160; RV32I-NEXT: mv a2, a1 19161; RV32I-NEXT: bgeu s3, a0, .LBB126_1 19162; RV32I-NEXT: # %bb.3: # %atomicrmw.start 19163; RV32I-NEXT: # in Loop: Header=BB126_2 Depth=1 19164; RV32I-NEXT: mv a2, s0 19165; RV32I-NEXT: j .LBB126_1 19166; RV32I-NEXT: .LBB126_4: # %atomicrmw.end 19167; RV32I-NEXT: mv a0, a1 19168; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 19169; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 19170; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 19171; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 19172; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 19173; RV32I-NEXT: addi sp, sp, 32 19174; RV32I-NEXT: ret 19175; 19176; RV32IA-WMO-LABEL: atomicrmw_umin_i16_acquire: 19177; RV32IA-WMO: # %bb.0: 19178; RV32IA-WMO-NEXT: andi a2, a0, -4 19179; RV32IA-WMO-NEXT: slli a0, a0, 3 19180; RV32IA-WMO-NEXT: lui a3, 16 19181; RV32IA-WMO-NEXT: addi a3, a3, -1 19182; RV32IA-WMO-NEXT: sll a4, a3, a0 19183; RV32IA-WMO-NEXT: and a1, a1, a3 19184; RV32IA-WMO-NEXT: sll a1, a1, a0 19185; RV32IA-WMO-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1 19186; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 19187; RV32IA-WMO-NEXT: and a6, a3, a4 19188; RV32IA-WMO-NEXT: mv a5, a3 19189; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB126_3 19190; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1 19191; RV32IA-WMO-NEXT: xor a5, a3, a1 19192; RV32IA-WMO-NEXT: and a5, a5, a4 19193; RV32IA-WMO-NEXT: xor a5, a3, a5 19194; RV32IA-WMO-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1 19195; RV32IA-WMO-NEXT: sc.w a5, a5, (a2) 19196; RV32IA-WMO-NEXT: bnez a5, .LBB126_1 19197; RV32IA-WMO-NEXT: # %bb.4: 19198; RV32IA-WMO-NEXT: srl a0, a3, a0 19199; RV32IA-WMO-NEXT: ret 19200; 19201; RV32IA-TSO-LABEL: atomicrmw_umin_i16_acquire: 19202; RV32IA-TSO: # %bb.0: 19203; RV32IA-TSO-NEXT: andi a2, a0, -4 19204; RV32IA-TSO-NEXT: slli a0, a0, 3 19205; RV32IA-TSO-NEXT: lui a3, 16 19206; RV32IA-TSO-NEXT: addi a3, a3, -1 19207; RV32IA-TSO-NEXT: sll a4, a3, a0 19208; RV32IA-TSO-NEXT: and a1, a1, a3 19209; RV32IA-TSO-NEXT: sll a1, a1, a0 19210; RV32IA-TSO-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1 19211; RV32IA-TSO-NEXT: lr.w a3, (a2) 19212; RV32IA-TSO-NEXT: and a6, a3, a4 19213; RV32IA-TSO-NEXT: mv a5, a3 19214; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB126_3 19215; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1 19216; RV32IA-TSO-NEXT: xor a5, a3, a1 19217; RV32IA-TSO-NEXT: and a5, a5, a4 19218; RV32IA-TSO-NEXT: xor a5, a3, a5 19219; RV32IA-TSO-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1 19220; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 19221; RV32IA-TSO-NEXT: bnez a5, .LBB126_1 19222; RV32IA-TSO-NEXT: # %bb.4: 19223; RV32IA-TSO-NEXT: srl a0, a3, a0 19224; RV32IA-TSO-NEXT: ret 19225; 19226; RV64I-LABEL: atomicrmw_umin_i16_acquire: 19227; RV64I: # %bb.0: 19228; RV64I-NEXT: addi sp, sp, -48 19229; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 19230; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 19231; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 19232; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 19233; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 19234; RV64I-NEXT: mv s0, a1 19235; RV64I-NEXT: mv s1, a0 19236; RV64I-NEXT: lhu a1, 0(a0) 19237; RV64I-NEXT: lui s2, 16 19238; RV64I-NEXT: addiw s2, s2, -1 19239; RV64I-NEXT: and s3, s0, s2 19240; RV64I-NEXT: j .LBB126_2 19241; RV64I-NEXT: .LBB126_1: # %atomicrmw.start 19242; RV64I-NEXT: # in Loop: Header=BB126_2 Depth=1 19243; RV64I-NEXT: sh a1, 6(sp) 19244; RV64I-NEXT: addi a1, sp, 6 19245; RV64I-NEXT: li a3, 2 19246; RV64I-NEXT: li a4, 2 19247; RV64I-NEXT: mv a0, s1 19248; RV64I-NEXT: call __atomic_compare_exchange_2 19249; RV64I-NEXT: lh a1, 6(sp) 19250; RV64I-NEXT: bnez a0, .LBB126_4 19251; RV64I-NEXT: .LBB126_2: # %atomicrmw.start 19252; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 19253; RV64I-NEXT: and a0, a1, s2 19254; RV64I-NEXT: mv a2, a1 19255; RV64I-NEXT: bgeu s3, a0, .LBB126_1 19256; RV64I-NEXT: # %bb.3: # %atomicrmw.start 19257; RV64I-NEXT: # in Loop: Header=BB126_2 Depth=1 19258; RV64I-NEXT: mv a2, s0 19259; RV64I-NEXT: j .LBB126_1 19260; RV64I-NEXT: .LBB126_4: # %atomicrmw.end 19261; RV64I-NEXT: mv a0, a1 19262; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 19263; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 19264; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 19265; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 19266; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 19267; RV64I-NEXT: addi sp, sp, 48 19268; RV64I-NEXT: ret 19269; 19270; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_acquire: 19271; RV64IA-WMO-NOZACAS: # %bb.0: 19272; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 19273; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 19274; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 19275; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 19276; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 19277; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 19278; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 19279; RV64IA-WMO-NOZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1 19280; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 19281; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4 19282; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3 19283; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB126_3 19284; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1 19285; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1 19286; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 19287; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 19288; RV64IA-WMO-NOZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1 19289; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2) 19290; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB126_1 19291; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 19292; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 19293; RV64IA-WMO-NOZACAS-NEXT: ret 19294; 19295; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_acquire: 19296; RV64IA-TSO-NOZACAS: # %bb.0: 19297; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 19298; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 19299; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 19300; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 19301; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 19302; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 19303; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 19304; RV64IA-TSO-NOZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1 19305; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 19306; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4 19307; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3 19308; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB126_3 19309; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1 19310; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1 19311; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 19312; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 19313; RV64IA-TSO-NOZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1 19314; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 19315; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB126_1 19316; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 19317; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 19318; RV64IA-TSO-NOZACAS-NEXT: ret 19319; 19320; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_acquire: 19321; RV64IA-WMO-ZACAS: # %bb.0: 19322; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 19323; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 19324; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 19325; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 19326; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 19327; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 19328; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 19329; RV64IA-WMO-ZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1 19330; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 19331; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4 19332; RV64IA-WMO-ZACAS-NEXT: mv a5, a3 19333; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB126_3 19334; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1 19335; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1 19336; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 19337; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 19338; RV64IA-WMO-ZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1 19339; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2) 19340; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB126_1 19341; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 19342; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 19343; RV64IA-WMO-ZACAS-NEXT: ret 19344; 19345; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_acquire: 19346; RV64IA-TSO-ZACAS: # %bb.0: 19347; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 19348; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 19349; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 19350; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 19351; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 19352; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 19353; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 19354; RV64IA-TSO-ZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1 19355; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 19356; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4 19357; RV64IA-TSO-ZACAS-NEXT: mv a5, a3 19358; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB126_3 19359; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1 19360; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1 19361; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 19362; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 19363; RV64IA-TSO-ZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1 19364; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 19365; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB126_1 19366; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 19367; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 19368; RV64IA-TSO-ZACAS-NEXT: ret 19369; 19370; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_acquire: 19371; RV64IA-WMO-ZABHA: # %bb.0: 19372; RV64IA-WMO-ZABHA-NEXT: amominu.h.aq a0, a1, (a0) 19373; RV64IA-WMO-ZABHA-NEXT: ret 19374; 19375; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_acquire: 19376; RV64IA-TSO-ZABHA: # %bb.0: 19377; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0) 19378; RV64IA-TSO-ZABHA-NEXT: ret 19379 %1 = atomicrmw umin ptr %a, i16 %b acquire 19380 ret i16 %1 19381} 19382 19383define i16 @atomicrmw_umin_i16_release(ptr %a, i16 %b) nounwind { 19384; RV32I-LABEL: atomicrmw_umin_i16_release: 19385; RV32I: # %bb.0: 19386; RV32I-NEXT: addi sp, sp, -32 19387; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 19388; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 19389; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 19390; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 19391; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 19392; RV32I-NEXT: mv s0, a1 19393; RV32I-NEXT: mv s1, a0 19394; RV32I-NEXT: lhu a1, 0(a0) 19395; RV32I-NEXT: lui s2, 16 19396; RV32I-NEXT: addi s2, s2, -1 19397; RV32I-NEXT: and s3, s0, s2 19398; RV32I-NEXT: j .LBB127_2 19399; RV32I-NEXT: .LBB127_1: # %atomicrmw.start 19400; RV32I-NEXT: # in Loop: Header=BB127_2 Depth=1 19401; RV32I-NEXT: sh a1, 10(sp) 19402; RV32I-NEXT: addi a1, sp, 10 19403; RV32I-NEXT: li a3, 3 19404; RV32I-NEXT: mv a0, s1 19405; RV32I-NEXT: li a4, 0 19406; RV32I-NEXT: call __atomic_compare_exchange_2 19407; RV32I-NEXT: lh a1, 10(sp) 19408; RV32I-NEXT: bnez a0, .LBB127_4 19409; RV32I-NEXT: .LBB127_2: # %atomicrmw.start 19410; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 19411; RV32I-NEXT: and a0, a1, s2 19412; RV32I-NEXT: mv a2, a1 19413; RV32I-NEXT: bgeu s3, a0, .LBB127_1 19414; RV32I-NEXT: # %bb.3: # %atomicrmw.start 19415; RV32I-NEXT: # in Loop: Header=BB127_2 Depth=1 19416; RV32I-NEXT: mv a2, s0 19417; RV32I-NEXT: j .LBB127_1 19418; RV32I-NEXT: .LBB127_4: # %atomicrmw.end 19419; RV32I-NEXT: mv a0, a1 19420; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 19421; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 19422; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 19423; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 19424; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 19425; RV32I-NEXT: addi sp, sp, 32 19426; RV32I-NEXT: ret 19427; 19428; RV32IA-WMO-LABEL: atomicrmw_umin_i16_release: 19429; RV32IA-WMO: # %bb.0: 19430; RV32IA-WMO-NEXT: andi a2, a0, -4 19431; RV32IA-WMO-NEXT: slli a0, a0, 3 19432; RV32IA-WMO-NEXT: lui a3, 16 19433; RV32IA-WMO-NEXT: addi a3, a3, -1 19434; RV32IA-WMO-NEXT: sll a4, a3, a0 19435; RV32IA-WMO-NEXT: and a1, a1, a3 19436; RV32IA-WMO-NEXT: sll a1, a1, a0 19437; RV32IA-WMO-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1 19438; RV32IA-WMO-NEXT: lr.w a3, (a2) 19439; RV32IA-WMO-NEXT: and a6, a3, a4 19440; RV32IA-WMO-NEXT: mv a5, a3 19441; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB127_3 19442; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1 19443; RV32IA-WMO-NEXT: xor a5, a3, a1 19444; RV32IA-WMO-NEXT: and a5, a5, a4 19445; RV32IA-WMO-NEXT: xor a5, a3, a5 19446; RV32IA-WMO-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1 19447; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 19448; RV32IA-WMO-NEXT: bnez a5, .LBB127_1 19449; RV32IA-WMO-NEXT: # %bb.4: 19450; RV32IA-WMO-NEXT: srl a0, a3, a0 19451; RV32IA-WMO-NEXT: ret 19452; 19453; RV32IA-TSO-LABEL: atomicrmw_umin_i16_release: 19454; RV32IA-TSO: # %bb.0: 19455; RV32IA-TSO-NEXT: andi a2, a0, -4 19456; RV32IA-TSO-NEXT: slli a0, a0, 3 19457; RV32IA-TSO-NEXT: lui a3, 16 19458; RV32IA-TSO-NEXT: addi a3, a3, -1 19459; RV32IA-TSO-NEXT: sll a4, a3, a0 19460; RV32IA-TSO-NEXT: and a1, a1, a3 19461; RV32IA-TSO-NEXT: sll a1, a1, a0 19462; RV32IA-TSO-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1 19463; RV32IA-TSO-NEXT: lr.w a3, (a2) 19464; RV32IA-TSO-NEXT: and a6, a3, a4 19465; RV32IA-TSO-NEXT: mv a5, a3 19466; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB127_3 19467; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1 19468; RV32IA-TSO-NEXT: xor a5, a3, a1 19469; RV32IA-TSO-NEXT: and a5, a5, a4 19470; RV32IA-TSO-NEXT: xor a5, a3, a5 19471; RV32IA-TSO-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1 19472; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 19473; RV32IA-TSO-NEXT: bnez a5, .LBB127_1 19474; RV32IA-TSO-NEXT: # %bb.4: 19475; RV32IA-TSO-NEXT: srl a0, a3, a0 19476; RV32IA-TSO-NEXT: ret 19477; 19478; RV64I-LABEL: atomicrmw_umin_i16_release: 19479; RV64I: # %bb.0: 19480; RV64I-NEXT: addi sp, sp, -48 19481; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 19482; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 19483; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 19484; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 19485; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 19486; RV64I-NEXT: mv s0, a1 19487; RV64I-NEXT: mv s1, a0 19488; RV64I-NEXT: lhu a1, 0(a0) 19489; RV64I-NEXT: lui s2, 16 19490; RV64I-NEXT: addiw s2, s2, -1 19491; RV64I-NEXT: and s3, s0, s2 19492; RV64I-NEXT: j .LBB127_2 19493; RV64I-NEXT: .LBB127_1: # %atomicrmw.start 19494; RV64I-NEXT: # in Loop: Header=BB127_2 Depth=1 19495; RV64I-NEXT: sh a1, 6(sp) 19496; RV64I-NEXT: addi a1, sp, 6 19497; RV64I-NEXT: li a3, 3 19498; RV64I-NEXT: mv a0, s1 19499; RV64I-NEXT: li a4, 0 19500; RV64I-NEXT: call __atomic_compare_exchange_2 19501; RV64I-NEXT: lh a1, 6(sp) 19502; RV64I-NEXT: bnez a0, .LBB127_4 19503; RV64I-NEXT: .LBB127_2: # %atomicrmw.start 19504; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 19505; RV64I-NEXT: and a0, a1, s2 19506; RV64I-NEXT: mv a2, a1 19507; RV64I-NEXT: bgeu s3, a0, .LBB127_1 19508; RV64I-NEXT: # %bb.3: # %atomicrmw.start 19509; RV64I-NEXT: # in Loop: Header=BB127_2 Depth=1 19510; RV64I-NEXT: mv a2, s0 19511; RV64I-NEXT: j .LBB127_1 19512; RV64I-NEXT: .LBB127_4: # %atomicrmw.end 19513; RV64I-NEXT: mv a0, a1 19514; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 19515; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 19516; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 19517; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 19518; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 19519; RV64I-NEXT: addi sp, sp, 48 19520; RV64I-NEXT: ret 19521; 19522; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_release: 19523; RV64IA-WMO-NOZACAS: # %bb.0: 19524; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 19525; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 19526; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 19527; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 19528; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 19529; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 19530; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 19531; RV64IA-WMO-NOZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1 19532; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2) 19533; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4 19534; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3 19535; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB127_3 19536; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1 19537; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1 19538; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 19539; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 19540; RV64IA-WMO-NOZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1 19541; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 19542; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB127_1 19543; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 19544; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 19545; RV64IA-WMO-NOZACAS-NEXT: ret 19546; 19547; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_release: 19548; RV64IA-TSO-NOZACAS: # %bb.0: 19549; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 19550; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 19551; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 19552; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 19553; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 19554; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 19555; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 19556; RV64IA-TSO-NOZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1 19557; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 19558; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4 19559; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3 19560; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB127_3 19561; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1 19562; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1 19563; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 19564; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 19565; RV64IA-TSO-NOZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1 19566; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 19567; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB127_1 19568; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 19569; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 19570; RV64IA-TSO-NOZACAS-NEXT: ret 19571; 19572; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_release: 19573; RV64IA-WMO-ZACAS: # %bb.0: 19574; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 19575; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 19576; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 19577; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 19578; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 19579; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 19580; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 19581; RV64IA-WMO-ZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1 19582; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2) 19583; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4 19584; RV64IA-WMO-ZACAS-NEXT: mv a5, a3 19585; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB127_3 19586; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1 19587; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1 19588; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 19589; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 19590; RV64IA-WMO-ZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1 19591; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 19592; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB127_1 19593; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 19594; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 19595; RV64IA-WMO-ZACAS-NEXT: ret 19596; 19597; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_release: 19598; RV64IA-TSO-ZACAS: # %bb.0: 19599; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 19600; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 19601; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 19602; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 19603; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 19604; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 19605; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 19606; RV64IA-TSO-ZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1 19607; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 19608; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4 19609; RV64IA-TSO-ZACAS-NEXT: mv a5, a3 19610; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB127_3 19611; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1 19612; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1 19613; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 19614; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 19615; RV64IA-TSO-ZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1 19616; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 19617; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB127_1 19618; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 19619; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 19620; RV64IA-TSO-ZACAS-NEXT: ret 19621; 19622; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_release: 19623; RV64IA-WMO-ZABHA: # %bb.0: 19624; RV64IA-WMO-ZABHA-NEXT: amominu.h.rl a0, a1, (a0) 19625; RV64IA-WMO-ZABHA-NEXT: ret 19626; 19627; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_release: 19628; RV64IA-TSO-ZABHA: # %bb.0: 19629; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0) 19630; RV64IA-TSO-ZABHA-NEXT: ret 19631 %1 = atomicrmw umin ptr %a, i16 %b release 19632 ret i16 %1 19633} 19634 19635define i16 @atomicrmw_umin_i16_acq_rel(ptr %a, i16 %b) nounwind { 19636; RV32I-LABEL: atomicrmw_umin_i16_acq_rel: 19637; RV32I: # %bb.0: 19638; RV32I-NEXT: addi sp, sp, -32 19639; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 19640; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 19641; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 19642; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 19643; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 19644; RV32I-NEXT: mv s0, a1 19645; RV32I-NEXT: mv s1, a0 19646; RV32I-NEXT: lhu a1, 0(a0) 19647; RV32I-NEXT: lui s2, 16 19648; RV32I-NEXT: addi s2, s2, -1 19649; RV32I-NEXT: and s3, s0, s2 19650; RV32I-NEXT: j .LBB128_2 19651; RV32I-NEXT: .LBB128_1: # %atomicrmw.start 19652; RV32I-NEXT: # in Loop: Header=BB128_2 Depth=1 19653; RV32I-NEXT: sh a1, 10(sp) 19654; RV32I-NEXT: addi a1, sp, 10 19655; RV32I-NEXT: li a3, 4 19656; RV32I-NEXT: li a4, 2 19657; RV32I-NEXT: mv a0, s1 19658; RV32I-NEXT: call __atomic_compare_exchange_2 19659; RV32I-NEXT: lh a1, 10(sp) 19660; RV32I-NEXT: bnez a0, .LBB128_4 19661; RV32I-NEXT: .LBB128_2: # %atomicrmw.start 19662; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 19663; RV32I-NEXT: and a0, a1, s2 19664; RV32I-NEXT: mv a2, a1 19665; RV32I-NEXT: bgeu s3, a0, .LBB128_1 19666; RV32I-NEXT: # %bb.3: # %atomicrmw.start 19667; RV32I-NEXT: # in Loop: Header=BB128_2 Depth=1 19668; RV32I-NEXT: mv a2, s0 19669; RV32I-NEXT: j .LBB128_1 19670; RV32I-NEXT: .LBB128_4: # %atomicrmw.end 19671; RV32I-NEXT: mv a0, a1 19672; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 19673; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 19674; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 19675; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 19676; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 19677; RV32I-NEXT: addi sp, sp, 32 19678; RV32I-NEXT: ret 19679; 19680; RV32IA-WMO-LABEL: atomicrmw_umin_i16_acq_rel: 19681; RV32IA-WMO: # %bb.0: 19682; RV32IA-WMO-NEXT: andi a2, a0, -4 19683; RV32IA-WMO-NEXT: slli a0, a0, 3 19684; RV32IA-WMO-NEXT: lui a3, 16 19685; RV32IA-WMO-NEXT: addi a3, a3, -1 19686; RV32IA-WMO-NEXT: sll a4, a3, a0 19687; RV32IA-WMO-NEXT: and a1, a1, a3 19688; RV32IA-WMO-NEXT: sll a1, a1, a0 19689; RV32IA-WMO-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1 19690; RV32IA-WMO-NEXT: lr.w.aq a3, (a2) 19691; RV32IA-WMO-NEXT: and a6, a3, a4 19692; RV32IA-WMO-NEXT: mv a5, a3 19693; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB128_3 19694; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1 19695; RV32IA-WMO-NEXT: xor a5, a3, a1 19696; RV32IA-WMO-NEXT: and a5, a5, a4 19697; RV32IA-WMO-NEXT: xor a5, a3, a5 19698; RV32IA-WMO-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1 19699; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2) 19700; RV32IA-WMO-NEXT: bnez a5, .LBB128_1 19701; RV32IA-WMO-NEXT: # %bb.4: 19702; RV32IA-WMO-NEXT: srl a0, a3, a0 19703; RV32IA-WMO-NEXT: ret 19704; 19705; RV32IA-TSO-LABEL: atomicrmw_umin_i16_acq_rel: 19706; RV32IA-TSO: # %bb.0: 19707; RV32IA-TSO-NEXT: andi a2, a0, -4 19708; RV32IA-TSO-NEXT: slli a0, a0, 3 19709; RV32IA-TSO-NEXT: lui a3, 16 19710; RV32IA-TSO-NEXT: addi a3, a3, -1 19711; RV32IA-TSO-NEXT: sll a4, a3, a0 19712; RV32IA-TSO-NEXT: and a1, a1, a3 19713; RV32IA-TSO-NEXT: sll a1, a1, a0 19714; RV32IA-TSO-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1 19715; RV32IA-TSO-NEXT: lr.w a3, (a2) 19716; RV32IA-TSO-NEXT: and a6, a3, a4 19717; RV32IA-TSO-NEXT: mv a5, a3 19718; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB128_3 19719; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1 19720; RV32IA-TSO-NEXT: xor a5, a3, a1 19721; RV32IA-TSO-NEXT: and a5, a5, a4 19722; RV32IA-TSO-NEXT: xor a5, a3, a5 19723; RV32IA-TSO-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1 19724; RV32IA-TSO-NEXT: sc.w a5, a5, (a2) 19725; RV32IA-TSO-NEXT: bnez a5, .LBB128_1 19726; RV32IA-TSO-NEXT: # %bb.4: 19727; RV32IA-TSO-NEXT: srl a0, a3, a0 19728; RV32IA-TSO-NEXT: ret 19729; 19730; RV64I-LABEL: atomicrmw_umin_i16_acq_rel: 19731; RV64I: # %bb.0: 19732; RV64I-NEXT: addi sp, sp, -48 19733; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 19734; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 19735; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 19736; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 19737; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 19738; RV64I-NEXT: mv s0, a1 19739; RV64I-NEXT: mv s1, a0 19740; RV64I-NEXT: lhu a1, 0(a0) 19741; RV64I-NEXT: lui s2, 16 19742; RV64I-NEXT: addiw s2, s2, -1 19743; RV64I-NEXT: and s3, s0, s2 19744; RV64I-NEXT: j .LBB128_2 19745; RV64I-NEXT: .LBB128_1: # %atomicrmw.start 19746; RV64I-NEXT: # in Loop: Header=BB128_2 Depth=1 19747; RV64I-NEXT: sh a1, 6(sp) 19748; RV64I-NEXT: addi a1, sp, 6 19749; RV64I-NEXT: li a3, 4 19750; RV64I-NEXT: li a4, 2 19751; RV64I-NEXT: mv a0, s1 19752; RV64I-NEXT: call __atomic_compare_exchange_2 19753; RV64I-NEXT: lh a1, 6(sp) 19754; RV64I-NEXT: bnez a0, .LBB128_4 19755; RV64I-NEXT: .LBB128_2: # %atomicrmw.start 19756; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 19757; RV64I-NEXT: and a0, a1, s2 19758; RV64I-NEXT: mv a2, a1 19759; RV64I-NEXT: bgeu s3, a0, .LBB128_1 19760; RV64I-NEXT: # %bb.3: # %atomicrmw.start 19761; RV64I-NEXT: # in Loop: Header=BB128_2 Depth=1 19762; RV64I-NEXT: mv a2, s0 19763; RV64I-NEXT: j .LBB128_1 19764; RV64I-NEXT: .LBB128_4: # %atomicrmw.end 19765; RV64I-NEXT: mv a0, a1 19766; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 19767; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 19768; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 19769; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 19770; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 19771; RV64I-NEXT: addi sp, sp, 48 19772; RV64I-NEXT: ret 19773; 19774; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_acq_rel: 19775; RV64IA-WMO-NOZACAS: # %bb.0: 19776; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4 19777; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3 19778; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16 19779; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1 19780; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0 19781; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3 19782; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0 19783; RV64IA-WMO-NOZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1 19784; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2) 19785; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4 19786; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3 19787; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB128_3 19788; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1 19789; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1 19790; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4 19791; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5 19792; RV64IA-WMO-NOZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1 19793; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 19794; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB128_1 19795; RV64IA-WMO-NOZACAS-NEXT: # %bb.4: 19796; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0 19797; RV64IA-WMO-NOZACAS-NEXT: ret 19798; 19799; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_acq_rel: 19800; RV64IA-TSO-NOZACAS: # %bb.0: 19801; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4 19802; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3 19803; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16 19804; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1 19805; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0 19806; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3 19807; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0 19808; RV64IA-TSO-NOZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1 19809; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2) 19810; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4 19811; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3 19812; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB128_3 19813; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1 19814; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1 19815; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4 19816; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5 19817; RV64IA-TSO-NOZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1 19818; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2) 19819; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB128_1 19820; RV64IA-TSO-NOZACAS-NEXT: # %bb.4: 19821; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0 19822; RV64IA-TSO-NOZACAS-NEXT: ret 19823; 19824; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_acq_rel: 19825; RV64IA-WMO-ZACAS: # %bb.0: 19826; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4 19827; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3 19828; RV64IA-WMO-ZACAS-NEXT: lui a3, 16 19829; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1 19830; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0 19831; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3 19832; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0 19833; RV64IA-WMO-ZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1 19834; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2) 19835; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4 19836; RV64IA-WMO-ZACAS-NEXT: mv a5, a3 19837; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB128_3 19838; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1 19839; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1 19840; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4 19841; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5 19842; RV64IA-WMO-ZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1 19843; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 19844; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB128_1 19845; RV64IA-WMO-ZACAS-NEXT: # %bb.4: 19846; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0 19847; RV64IA-WMO-ZACAS-NEXT: ret 19848; 19849; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_acq_rel: 19850; RV64IA-TSO-ZACAS: # %bb.0: 19851; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4 19852; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3 19853; RV64IA-TSO-ZACAS-NEXT: lui a3, 16 19854; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1 19855; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0 19856; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3 19857; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0 19858; RV64IA-TSO-ZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1 19859; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2) 19860; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4 19861; RV64IA-TSO-ZACAS-NEXT: mv a5, a3 19862; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB128_3 19863; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1 19864; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1 19865; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4 19866; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5 19867; RV64IA-TSO-ZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1 19868; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2) 19869; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB128_1 19870; RV64IA-TSO-ZACAS-NEXT: # %bb.4: 19871; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0 19872; RV64IA-TSO-ZACAS-NEXT: ret 19873; 19874; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_acq_rel: 19875; RV64IA-WMO-ZABHA: # %bb.0: 19876; RV64IA-WMO-ZABHA-NEXT: amominu.h.aqrl a0, a1, (a0) 19877; RV64IA-WMO-ZABHA-NEXT: ret 19878; 19879; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_acq_rel: 19880; RV64IA-TSO-ZABHA: # %bb.0: 19881; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0) 19882; RV64IA-TSO-ZABHA-NEXT: ret 19883 %1 = atomicrmw umin ptr %a, i16 %b acq_rel 19884 ret i16 %1 19885} 19886 19887define i16 @atomicrmw_umin_i16_seq_cst(ptr %a, i16 %b) nounwind { 19888; RV32I-LABEL: atomicrmw_umin_i16_seq_cst: 19889; RV32I: # %bb.0: 19890; RV32I-NEXT: addi sp, sp, -32 19891; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 19892; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 19893; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 19894; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 19895; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 19896; RV32I-NEXT: mv s0, a1 19897; RV32I-NEXT: mv s1, a0 19898; RV32I-NEXT: lhu a1, 0(a0) 19899; RV32I-NEXT: lui s2, 16 19900; RV32I-NEXT: addi s2, s2, -1 19901; RV32I-NEXT: and s3, s0, s2 19902; RV32I-NEXT: j .LBB129_2 19903; RV32I-NEXT: .LBB129_1: # %atomicrmw.start 19904; RV32I-NEXT: # in Loop: Header=BB129_2 Depth=1 19905; RV32I-NEXT: sh a1, 10(sp) 19906; RV32I-NEXT: addi a1, sp, 10 19907; RV32I-NEXT: li a3, 5 19908; RV32I-NEXT: li a4, 5 19909; RV32I-NEXT: mv a0, s1 19910; RV32I-NEXT: call __atomic_compare_exchange_2 19911; RV32I-NEXT: lh a1, 10(sp) 19912; RV32I-NEXT: bnez a0, .LBB129_4 19913; RV32I-NEXT: .LBB129_2: # %atomicrmw.start 19914; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 19915; RV32I-NEXT: and a0, a1, s2 19916; RV32I-NEXT: mv a2, a1 19917; RV32I-NEXT: bgeu s3, a0, .LBB129_1 19918; RV32I-NEXT: # %bb.3: # %atomicrmw.start 19919; RV32I-NEXT: # in Loop: Header=BB129_2 Depth=1 19920; RV32I-NEXT: mv a2, s0 19921; RV32I-NEXT: j .LBB129_1 19922; RV32I-NEXT: .LBB129_4: # %atomicrmw.end 19923; RV32I-NEXT: mv a0, a1 19924; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 19925; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 19926; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 19927; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 19928; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 19929; RV32I-NEXT: addi sp, sp, 32 19930; RV32I-NEXT: ret 19931; 19932; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst: 19933; RV32IA: # %bb.0: 19934; RV32IA-NEXT: andi a2, a0, -4 19935; RV32IA-NEXT: slli a0, a0, 3 19936; RV32IA-NEXT: lui a3, 16 19937; RV32IA-NEXT: addi a3, a3, -1 19938; RV32IA-NEXT: sll a4, a3, a0 19939; RV32IA-NEXT: and a1, a1, a3 19940; RV32IA-NEXT: sll a1, a1, a0 19941; RV32IA-NEXT: .LBB129_1: # =>This Inner Loop Header: Depth=1 19942; RV32IA-NEXT: lr.w.aqrl a3, (a2) 19943; RV32IA-NEXT: and a6, a3, a4 19944; RV32IA-NEXT: mv a5, a3 19945; RV32IA-NEXT: bgeu a1, a6, .LBB129_3 19946; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB129_1 Depth=1 19947; RV32IA-NEXT: xor a5, a3, a1 19948; RV32IA-NEXT: and a5, a5, a4 19949; RV32IA-NEXT: xor a5, a3, a5 19950; RV32IA-NEXT: .LBB129_3: # in Loop: Header=BB129_1 Depth=1 19951; RV32IA-NEXT: sc.w.rl a5, a5, (a2) 19952; RV32IA-NEXT: bnez a5, .LBB129_1 19953; RV32IA-NEXT: # %bb.4: 19954; RV32IA-NEXT: srl a0, a3, a0 19955; RV32IA-NEXT: ret 19956; 19957; RV64I-LABEL: atomicrmw_umin_i16_seq_cst: 19958; RV64I: # %bb.0: 19959; RV64I-NEXT: addi sp, sp, -48 19960; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 19961; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 19962; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 19963; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 19964; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 19965; RV64I-NEXT: mv s0, a1 19966; RV64I-NEXT: mv s1, a0 19967; RV64I-NEXT: lhu a1, 0(a0) 19968; RV64I-NEXT: lui s2, 16 19969; RV64I-NEXT: addiw s2, s2, -1 19970; RV64I-NEXT: and s3, s0, s2 19971; RV64I-NEXT: j .LBB129_2 19972; RV64I-NEXT: .LBB129_1: # %atomicrmw.start 19973; RV64I-NEXT: # in Loop: Header=BB129_2 Depth=1 19974; RV64I-NEXT: sh a1, 6(sp) 19975; RV64I-NEXT: addi a1, sp, 6 19976; RV64I-NEXT: li a3, 5 19977; RV64I-NEXT: li a4, 5 19978; RV64I-NEXT: mv a0, s1 19979; RV64I-NEXT: call __atomic_compare_exchange_2 19980; RV64I-NEXT: lh a1, 6(sp) 19981; RV64I-NEXT: bnez a0, .LBB129_4 19982; RV64I-NEXT: .LBB129_2: # %atomicrmw.start 19983; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 19984; RV64I-NEXT: and a0, a1, s2 19985; RV64I-NEXT: mv a2, a1 19986; RV64I-NEXT: bgeu s3, a0, .LBB129_1 19987; RV64I-NEXT: # %bb.3: # %atomicrmw.start 19988; RV64I-NEXT: # in Loop: Header=BB129_2 Depth=1 19989; RV64I-NEXT: mv a2, s0 19990; RV64I-NEXT: j .LBB129_1 19991; RV64I-NEXT: .LBB129_4: # %atomicrmw.end 19992; RV64I-NEXT: mv a0, a1 19993; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 19994; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 19995; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 19996; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 19997; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 19998; RV64I-NEXT: addi sp, sp, 48 19999; RV64I-NEXT: ret 20000; 20001; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i16_seq_cst: 20002; RV64IA-NOZACAS: # %bb.0: 20003; RV64IA-NOZACAS-NEXT: andi a2, a0, -4 20004; RV64IA-NOZACAS-NEXT: slli a0, a0, 3 20005; RV64IA-NOZACAS-NEXT: lui a3, 16 20006; RV64IA-NOZACAS-NEXT: addi a3, a3, -1 20007; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0 20008; RV64IA-NOZACAS-NEXT: and a1, a1, a3 20009; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0 20010; RV64IA-NOZACAS-NEXT: .LBB129_1: # =>This Inner Loop Header: Depth=1 20011; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2) 20012; RV64IA-NOZACAS-NEXT: and a6, a3, a4 20013; RV64IA-NOZACAS-NEXT: mv a5, a3 20014; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB129_3 20015; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB129_1 Depth=1 20016; RV64IA-NOZACAS-NEXT: xor a5, a3, a1 20017; RV64IA-NOZACAS-NEXT: and a5, a5, a4 20018; RV64IA-NOZACAS-NEXT: xor a5, a3, a5 20019; RV64IA-NOZACAS-NEXT: .LBB129_3: # in Loop: Header=BB129_1 Depth=1 20020; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2) 20021; RV64IA-NOZACAS-NEXT: bnez a5, .LBB129_1 20022; RV64IA-NOZACAS-NEXT: # %bb.4: 20023; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0 20024; RV64IA-NOZACAS-NEXT: ret 20025; 20026; RV64IA-ZACAS-LABEL: atomicrmw_umin_i16_seq_cst: 20027; RV64IA-ZACAS: # %bb.0: 20028; RV64IA-ZACAS-NEXT: andi a2, a0, -4 20029; RV64IA-ZACAS-NEXT: slli a0, a0, 3 20030; RV64IA-ZACAS-NEXT: lui a3, 16 20031; RV64IA-ZACAS-NEXT: addi a3, a3, -1 20032; RV64IA-ZACAS-NEXT: sllw a4, a3, a0 20033; RV64IA-ZACAS-NEXT: and a1, a1, a3 20034; RV64IA-ZACAS-NEXT: sllw a1, a1, a0 20035; RV64IA-ZACAS-NEXT: .LBB129_1: # =>This Inner Loop Header: Depth=1 20036; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2) 20037; RV64IA-ZACAS-NEXT: and a6, a3, a4 20038; RV64IA-ZACAS-NEXT: mv a5, a3 20039; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB129_3 20040; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB129_1 Depth=1 20041; RV64IA-ZACAS-NEXT: xor a5, a3, a1 20042; RV64IA-ZACAS-NEXT: and a5, a5, a4 20043; RV64IA-ZACAS-NEXT: xor a5, a3, a5 20044; RV64IA-ZACAS-NEXT: .LBB129_3: # in Loop: Header=BB129_1 Depth=1 20045; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2) 20046; RV64IA-ZACAS-NEXT: bnez a5, .LBB129_1 20047; RV64IA-ZACAS-NEXT: # %bb.4: 20048; RV64IA-ZACAS-NEXT: srlw a0, a3, a0 20049; RV64IA-ZACAS-NEXT: ret 20050; 20051; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_seq_cst: 20052; RV64IA-WMO-ZABHA: # %bb.0: 20053; RV64IA-WMO-ZABHA-NEXT: amominu.h.aqrl a0, a1, (a0) 20054; RV64IA-WMO-ZABHA-NEXT: ret 20055; 20056; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_seq_cst: 20057; RV64IA-TSO-ZABHA: # %bb.0: 20058; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0) 20059; RV64IA-TSO-ZABHA-NEXT: ret 20060 %1 = atomicrmw umin ptr %a, i16 %b seq_cst 20061 ret i16 %1 20062} 20063 20064define i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind { 20065; RV32I-LABEL: atomicrmw_xchg_i32_monotonic: 20066; RV32I: # %bb.0: 20067; RV32I-NEXT: addi sp, sp, -16 20068; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20069; RV32I-NEXT: li a2, 0 20070; RV32I-NEXT: call __atomic_exchange_4 20071; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20072; RV32I-NEXT: addi sp, sp, 16 20073; RV32I-NEXT: ret 20074; 20075; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic: 20076; RV32IA: # %bb.0: 20077; RV32IA-NEXT: amoswap.w a0, a1, (a0) 20078; RV32IA-NEXT: ret 20079; 20080; RV64I-LABEL: atomicrmw_xchg_i32_monotonic: 20081; RV64I: # %bb.0: 20082; RV64I-NEXT: addi sp, sp, -16 20083; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20084; RV64I-NEXT: li a2, 0 20085; RV64I-NEXT: call __atomic_exchange_4 20086; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20087; RV64I-NEXT: addi sp, sp, 16 20088; RV64I-NEXT: ret 20089; 20090; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic: 20091; RV64IA: # %bb.0: 20092; RV64IA-NEXT: amoswap.w a0, a1, (a0) 20093; RV64IA-NEXT: ret 20094 %1 = atomicrmw xchg ptr %a, i32 %b monotonic 20095 ret i32 %1 20096} 20097 20098define i32 @atomicrmw_xchg_i32_acquire(ptr %a, i32 %b) nounwind { 20099; RV32I-LABEL: atomicrmw_xchg_i32_acquire: 20100; RV32I: # %bb.0: 20101; RV32I-NEXT: addi sp, sp, -16 20102; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20103; RV32I-NEXT: li a2, 2 20104; RV32I-NEXT: call __atomic_exchange_4 20105; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20106; RV32I-NEXT: addi sp, sp, 16 20107; RV32I-NEXT: ret 20108; 20109; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_acquire: 20110; RV32IA-WMO: # %bb.0: 20111; RV32IA-WMO-NEXT: amoswap.w.aq a0, a1, (a0) 20112; RV32IA-WMO-NEXT: ret 20113; 20114; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_acquire: 20115; RV32IA-TSO: # %bb.0: 20116; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20117; RV32IA-TSO-NEXT: ret 20118; 20119; RV64I-LABEL: atomicrmw_xchg_i32_acquire: 20120; RV64I: # %bb.0: 20121; RV64I-NEXT: addi sp, sp, -16 20122; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20123; RV64I-NEXT: li a2, 2 20124; RV64I-NEXT: call __atomic_exchange_4 20125; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20126; RV64I-NEXT: addi sp, sp, 16 20127; RV64I-NEXT: ret 20128; 20129; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_acquire: 20130; RV64IA-WMO: # %bb.0: 20131; RV64IA-WMO-NEXT: amoswap.w.aq a0, a1, (a0) 20132; RV64IA-WMO-NEXT: ret 20133; 20134; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_acquire: 20135; RV64IA-TSO: # %bb.0: 20136; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20137; RV64IA-TSO-NEXT: ret 20138 %1 = atomicrmw xchg ptr %a, i32 %b acquire 20139 ret i32 %1 20140} 20141 20142define i32 @atomicrmw_xchg_i32_release(ptr %a, i32 %b) nounwind { 20143; RV32I-LABEL: atomicrmw_xchg_i32_release: 20144; RV32I: # %bb.0: 20145; RV32I-NEXT: addi sp, sp, -16 20146; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20147; RV32I-NEXT: li a2, 3 20148; RV32I-NEXT: call __atomic_exchange_4 20149; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20150; RV32I-NEXT: addi sp, sp, 16 20151; RV32I-NEXT: ret 20152; 20153; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_release: 20154; RV32IA-WMO: # %bb.0: 20155; RV32IA-WMO-NEXT: amoswap.w.rl a0, a1, (a0) 20156; RV32IA-WMO-NEXT: ret 20157; 20158; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_release: 20159; RV32IA-TSO: # %bb.0: 20160; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20161; RV32IA-TSO-NEXT: ret 20162; 20163; RV64I-LABEL: atomicrmw_xchg_i32_release: 20164; RV64I: # %bb.0: 20165; RV64I-NEXT: addi sp, sp, -16 20166; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20167; RV64I-NEXT: li a2, 3 20168; RV64I-NEXT: call __atomic_exchange_4 20169; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20170; RV64I-NEXT: addi sp, sp, 16 20171; RV64I-NEXT: ret 20172; 20173; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_release: 20174; RV64IA-WMO: # %bb.0: 20175; RV64IA-WMO-NEXT: amoswap.w.rl a0, a1, (a0) 20176; RV64IA-WMO-NEXT: ret 20177; 20178; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_release: 20179; RV64IA-TSO: # %bb.0: 20180; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20181; RV64IA-TSO-NEXT: ret 20182 %1 = atomicrmw xchg ptr %a, i32 %b release 20183 ret i32 %1 20184} 20185 20186define i32 @atomicrmw_xchg_i32_acq_rel(ptr %a, i32 %b) nounwind { 20187; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel: 20188; RV32I: # %bb.0: 20189; RV32I-NEXT: addi sp, sp, -16 20190; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20191; RV32I-NEXT: li a2, 4 20192; RV32I-NEXT: call __atomic_exchange_4 20193; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20194; RV32I-NEXT: addi sp, sp, 16 20195; RV32I-NEXT: ret 20196; 20197; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_acq_rel: 20198; RV32IA-WMO: # %bb.0: 20199; RV32IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0) 20200; RV32IA-WMO-NEXT: ret 20201; 20202; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_acq_rel: 20203; RV32IA-TSO: # %bb.0: 20204; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20205; RV32IA-TSO-NEXT: ret 20206; 20207; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel: 20208; RV64I: # %bb.0: 20209; RV64I-NEXT: addi sp, sp, -16 20210; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20211; RV64I-NEXT: li a2, 4 20212; RV64I-NEXT: call __atomic_exchange_4 20213; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20214; RV64I-NEXT: addi sp, sp, 16 20215; RV64I-NEXT: ret 20216; 20217; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_acq_rel: 20218; RV64IA-WMO: # %bb.0: 20219; RV64IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0) 20220; RV64IA-WMO-NEXT: ret 20221; 20222; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_acq_rel: 20223; RV64IA-TSO: # %bb.0: 20224; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20225; RV64IA-TSO-NEXT: ret 20226 %1 = atomicrmw xchg ptr %a, i32 %b acq_rel 20227 ret i32 %1 20228} 20229 20230define i32 @atomicrmw_xchg_i32_seq_cst(ptr %a, i32 %b) nounwind { 20231; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst: 20232; RV32I: # %bb.0: 20233; RV32I-NEXT: addi sp, sp, -16 20234; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20235; RV32I-NEXT: li a2, 5 20236; RV32I-NEXT: call __atomic_exchange_4 20237; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20238; RV32I-NEXT: addi sp, sp, 16 20239; RV32I-NEXT: ret 20240; 20241; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_seq_cst: 20242; RV32IA-WMO: # %bb.0: 20243; RV32IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0) 20244; RV32IA-WMO-NEXT: ret 20245; 20246; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_seq_cst: 20247; RV32IA-TSO: # %bb.0: 20248; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20249; RV32IA-TSO-NEXT: ret 20250; 20251; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst: 20252; RV64I: # %bb.0: 20253; RV64I-NEXT: addi sp, sp, -16 20254; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20255; RV64I-NEXT: li a2, 5 20256; RV64I-NEXT: call __atomic_exchange_4 20257; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20258; RV64I-NEXT: addi sp, sp, 16 20259; RV64I-NEXT: ret 20260; 20261; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_seq_cst: 20262; RV64IA-WMO: # %bb.0: 20263; RV64IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0) 20264; RV64IA-WMO-NEXT: ret 20265; 20266; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_seq_cst: 20267; RV64IA-TSO: # %bb.0: 20268; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0) 20269; RV64IA-TSO-NEXT: ret 20270 %1 = atomicrmw xchg ptr %a, i32 %b seq_cst 20271 ret i32 %1 20272} 20273 20274define i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind { 20275; RV32I-LABEL: atomicrmw_add_i32_monotonic: 20276; RV32I: # %bb.0: 20277; RV32I-NEXT: addi sp, sp, -16 20278; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20279; RV32I-NEXT: li a2, 0 20280; RV32I-NEXT: call __atomic_fetch_add_4 20281; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20282; RV32I-NEXT: addi sp, sp, 16 20283; RV32I-NEXT: ret 20284; 20285; RV32IA-LABEL: atomicrmw_add_i32_monotonic: 20286; RV32IA: # %bb.0: 20287; RV32IA-NEXT: amoadd.w a0, a1, (a0) 20288; RV32IA-NEXT: ret 20289; 20290; RV64I-LABEL: atomicrmw_add_i32_monotonic: 20291; RV64I: # %bb.0: 20292; RV64I-NEXT: addi sp, sp, -16 20293; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20294; RV64I-NEXT: li a2, 0 20295; RV64I-NEXT: call __atomic_fetch_add_4 20296; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20297; RV64I-NEXT: addi sp, sp, 16 20298; RV64I-NEXT: ret 20299; 20300; RV64IA-LABEL: atomicrmw_add_i32_monotonic: 20301; RV64IA: # %bb.0: 20302; RV64IA-NEXT: amoadd.w a0, a1, (a0) 20303; RV64IA-NEXT: ret 20304 %1 = atomicrmw add ptr %a, i32 %b monotonic 20305 ret i32 %1 20306} 20307 20308define i32 @atomicrmw_add_i32_acquire(ptr %a, i32 %b) nounwind { 20309; RV32I-LABEL: atomicrmw_add_i32_acquire: 20310; RV32I: # %bb.0: 20311; RV32I-NEXT: addi sp, sp, -16 20312; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20313; RV32I-NEXT: li a2, 2 20314; RV32I-NEXT: call __atomic_fetch_add_4 20315; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20316; RV32I-NEXT: addi sp, sp, 16 20317; RV32I-NEXT: ret 20318; 20319; RV32IA-WMO-LABEL: atomicrmw_add_i32_acquire: 20320; RV32IA-WMO: # %bb.0: 20321; RV32IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0) 20322; RV32IA-WMO-NEXT: ret 20323; 20324; RV32IA-TSO-LABEL: atomicrmw_add_i32_acquire: 20325; RV32IA-TSO: # %bb.0: 20326; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20327; RV32IA-TSO-NEXT: ret 20328; 20329; RV64I-LABEL: atomicrmw_add_i32_acquire: 20330; RV64I: # %bb.0: 20331; RV64I-NEXT: addi sp, sp, -16 20332; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20333; RV64I-NEXT: li a2, 2 20334; RV64I-NEXT: call __atomic_fetch_add_4 20335; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20336; RV64I-NEXT: addi sp, sp, 16 20337; RV64I-NEXT: ret 20338; 20339; RV64IA-WMO-LABEL: atomicrmw_add_i32_acquire: 20340; RV64IA-WMO: # %bb.0: 20341; RV64IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0) 20342; RV64IA-WMO-NEXT: ret 20343; 20344; RV64IA-TSO-LABEL: atomicrmw_add_i32_acquire: 20345; RV64IA-TSO: # %bb.0: 20346; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20347; RV64IA-TSO-NEXT: ret 20348 %1 = atomicrmw add ptr %a, i32 %b acquire 20349 ret i32 %1 20350} 20351 20352define i32 @atomicrmw_add_i32_release(ptr %a, i32 %b) nounwind { 20353; RV32I-LABEL: atomicrmw_add_i32_release: 20354; RV32I: # %bb.0: 20355; RV32I-NEXT: addi sp, sp, -16 20356; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20357; RV32I-NEXT: li a2, 3 20358; RV32I-NEXT: call __atomic_fetch_add_4 20359; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20360; RV32I-NEXT: addi sp, sp, 16 20361; RV32I-NEXT: ret 20362; 20363; RV32IA-WMO-LABEL: atomicrmw_add_i32_release: 20364; RV32IA-WMO: # %bb.0: 20365; RV32IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0) 20366; RV32IA-WMO-NEXT: ret 20367; 20368; RV32IA-TSO-LABEL: atomicrmw_add_i32_release: 20369; RV32IA-TSO: # %bb.0: 20370; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20371; RV32IA-TSO-NEXT: ret 20372; 20373; RV64I-LABEL: atomicrmw_add_i32_release: 20374; RV64I: # %bb.0: 20375; RV64I-NEXT: addi sp, sp, -16 20376; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20377; RV64I-NEXT: li a2, 3 20378; RV64I-NEXT: call __atomic_fetch_add_4 20379; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20380; RV64I-NEXT: addi sp, sp, 16 20381; RV64I-NEXT: ret 20382; 20383; RV64IA-WMO-LABEL: atomicrmw_add_i32_release: 20384; RV64IA-WMO: # %bb.0: 20385; RV64IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0) 20386; RV64IA-WMO-NEXT: ret 20387; 20388; RV64IA-TSO-LABEL: atomicrmw_add_i32_release: 20389; RV64IA-TSO: # %bb.0: 20390; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20391; RV64IA-TSO-NEXT: ret 20392 %1 = atomicrmw add ptr %a, i32 %b release 20393 ret i32 %1 20394} 20395 20396define i32 @atomicrmw_add_i32_acq_rel(ptr %a, i32 %b) nounwind { 20397; RV32I-LABEL: atomicrmw_add_i32_acq_rel: 20398; RV32I: # %bb.0: 20399; RV32I-NEXT: addi sp, sp, -16 20400; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20401; RV32I-NEXT: li a2, 4 20402; RV32I-NEXT: call __atomic_fetch_add_4 20403; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20404; RV32I-NEXT: addi sp, sp, 16 20405; RV32I-NEXT: ret 20406; 20407; RV32IA-WMO-LABEL: atomicrmw_add_i32_acq_rel: 20408; RV32IA-WMO: # %bb.0: 20409; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20410; RV32IA-WMO-NEXT: ret 20411; 20412; RV32IA-TSO-LABEL: atomicrmw_add_i32_acq_rel: 20413; RV32IA-TSO: # %bb.0: 20414; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20415; RV32IA-TSO-NEXT: ret 20416; 20417; RV64I-LABEL: atomicrmw_add_i32_acq_rel: 20418; RV64I: # %bb.0: 20419; RV64I-NEXT: addi sp, sp, -16 20420; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20421; RV64I-NEXT: li a2, 4 20422; RV64I-NEXT: call __atomic_fetch_add_4 20423; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20424; RV64I-NEXT: addi sp, sp, 16 20425; RV64I-NEXT: ret 20426; 20427; RV64IA-WMO-LABEL: atomicrmw_add_i32_acq_rel: 20428; RV64IA-WMO: # %bb.0: 20429; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20430; RV64IA-WMO-NEXT: ret 20431; 20432; RV64IA-TSO-LABEL: atomicrmw_add_i32_acq_rel: 20433; RV64IA-TSO: # %bb.0: 20434; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20435; RV64IA-TSO-NEXT: ret 20436 %1 = atomicrmw add ptr %a, i32 %b acq_rel 20437 ret i32 %1 20438} 20439 20440define i32 @atomicrmw_add_i32_seq_cst(ptr %a, i32 %b) nounwind { 20441; RV32I-LABEL: atomicrmw_add_i32_seq_cst: 20442; RV32I: # %bb.0: 20443; RV32I-NEXT: addi sp, sp, -16 20444; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20445; RV32I-NEXT: li a2, 5 20446; RV32I-NEXT: call __atomic_fetch_add_4 20447; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20448; RV32I-NEXT: addi sp, sp, 16 20449; RV32I-NEXT: ret 20450; 20451; RV32IA-WMO-LABEL: atomicrmw_add_i32_seq_cst: 20452; RV32IA-WMO: # %bb.0: 20453; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20454; RV32IA-WMO-NEXT: ret 20455; 20456; RV32IA-TSO-LABEL: atomicrmw_add_i32_seq_cst: 20457; RV32IA-TSO: # %bb.0: 20458; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20459; RV32IA-TSO-NEXT: ret 20460; 20461; RV64I-LABEL: atomicrmw_add_i32_seq_cst: 20462; RV64I: # %bb.0: 20463; RV64I-NEXT: addi sp, sp, -16 20464; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20465; RV64I-NEXT: li a2, 5 20466; RV64I-NEXT: call __atomic_fetch_add_4 20467; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20468; RV64I-NEXT: addi sp, sp, 16 20469; RV64I-NEXT: ret 20470; 20471; RV64IA-WMO-LABEL: atomicrmw_add_i32_seq_cst: 20472; RV64IA-WMO: # %bb.0: 20473; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20474; RV64IA-WMO-NEXT: ret 20475; 20476; RV64IA-TSO-LABEL: atomicrmw_add_i32_seq_cst: 20477; RV64IA-TSO: # %bb.0: 20478; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20479; RV64IA-TSO-NEXT: ret 20480 %1 = atomicrmw add ptr %a, i32 %b seq_cst 20481 ret i32 %1 20482} 20483 20484define i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind { 20485; RV32I-LABEL: atomicrmw_sub_i32_monotonic: 20486; RV32I: # %bb.0: 20487; RV32I-NEXT: addi sp, sp, -16 20488; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20489; RV32I-NEXT: li a2, 0 20490; RV32I-NEXT: call __atomic_fetch_sub_4 20491; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20492; RV32I-NEXT: addi sp, sp, 16 20493; RV32I-NEXT: ret 20494; 20495; RV32IA-LABEL: atomicrmw_sub_i32_monotonic: 20496; RV32IA: # %bb.0: 20497; RV32IA-NEXT: neg a1, a1 20498; RV32IA-NEXT: amoadd.w a0, a1, (a0) 20499; RV32IA-NEXT: ret 20500; 20501; RV64I-LABEL: atomicrmw_sub_i32_monotonic: 20502; RV64I: # %bb.0: 20503; RV64I-NEXT: addi sp, sp, -16 20504; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20505; RV64I-NEXT: li a2, 0 20506; RV64I-NEXT: call __atomic_fetch_sub_4 20507; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20508; RV64I-NEXT: addi sp, sp, 16 20509; RV64I-NEXT: ret 20510; 20511; RV64IA-LABEL: atomicrmw_sub_i32_monotonic: 20512; RV64IA: # %bb.0: 20513; RV64IA-NEXT: neg a1, a1 20514; RV64IA-NEXT: amoadd.w a0, a1, (a0) 20515; RV64IA-NEXT: ret 20516 %1 = atomicrmw sub ptr %a, i32 %b monotonic 20517 ret i32 %1 20518} 20519 20520define i32 @atomicrmw_sub_i32_acquire(ptr %a, i32 %b) nounwind { 20521; RV32I-LABEL: atomicrmw_sub_i32_acquire: 20522; RV32I: # %bb.0: 20523; RV32I-NEXT: addi sp, sp, -16 20524; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20525; RV32I-NEXT: li a2, 2 20526; RV32I-NEXT: call __atomic_fetch_sub_4 20527; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20528; RV32I-NEXT: addi sp, sp, 16 20529; RV32I-NEXT: ret 20530; 20531; RV32IA-WMO-LABEL: atomicrmw_sub_i32_acquire: 20532; RV32IA-WMO: # %bb.0: 20533; RV32IA-WMO-NEXT: neg a1, a1 20534; RV32IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0) 20535; RV32IA-WMO-NEXT: ret 20536; 20537; RV32IA-TSO-LABEL: atomicrmw_sub_i32_acquire: 20538; RV32IA-TSO: # %bb.0: 20539; RV32IA-TSO-NEXT: neg a1, a1 20540; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20541; RV32IA-TSO-NEXT: ret 20542; 20543; RV64I-LABEL: atomicrmw_sub_i32_acquire: 20544; RV64I: # %bb.0: 20545; RV64I-NEXT: addi sp, sp, -16 20546; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20547; RV64I-NEXT: li a2, 2 20548; RV64I-NEXT: call __atomic_fetch_sub_4 20549; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20550; RV64I-NEXT: addi sp, sp, 16 20551; RV64I-NEXT: ret 20552; 20553; RV64IA-WMO-LABEL: atomicrmw_sub_i32_acquire: 20554; RV64IA-WMO: # %bb.0: 20555; RV64IA-WMO-NEXT: neg a1, a1 20556; RV64IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0) 20557; RV64IA-WMO-NEXT: ret 20558; 20559; RV64IA-TSO-LABEL: atomicrmw_sub_i32_acquire: 20560; RV64IA-TSO: # %bb.0: 20561; RV64IA-TSO-NEXT: neg a1, a1 20562; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20563; RV64IA-TSO-NEXT: ret 20564 %1 = atomicrmw sub ptr %a, i32 %b acquire 20565 ret i32 %1 20566} 20567 20568define i32 @atomicrmw_sub_i32_release(ptr %a, i32 %b) nounwind { 20569; RV32I-LABEL: atomicrmw_sub_i32_release: 20570; RV32I: # %bb.0: 20571; RV32I-NEXT: addi sp, sp, -16 20572; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20573; RV32I-NEXT: li a2, 3 20574; RV32I-NEXT: call __atomic_fetch_sub_4 20575; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20576; RV32I-NEXT: addi sp, sp, 16 20577; RV32I-NEXT: ret 20578; 20579; RV32IA-WMO-LABEL: atomicrmw_sub_i32_release: 20580; RV32IA-WMO: # %bb.0: 20581; RV32IA-WMO-NEXT: neg a1, a1 20582; RV32IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0) 20583; RV32IA-WMO-NEXT: ret 20584; 20585; RV32IA-TSO-LABEL: atomicrmw_sub_i32_release: 20586; RV32IA-TSO: # %bb.0: 20587; RV32IA-TSO-NEXT: neg a1, a1 20588; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20589; RV32IA-TSO-NEXT: ret 20590; 20591; RV64I-LABEL: atomicrmw_sub_i32_release: 20592; RV64I: # %bb.0: 20593; RV64I-NEXT: addi sp, sp, -16 20594; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20595; RV64I-NEXT: li a2, 3 20596; RV64I-NEXT: call __atomic_fetch_sub_4 20597; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20598; RV64I-NEXT: addi sp, sp, 16 20599; RV64I-NEXT: ret 20600; 20601; RV64IA-WMO-LABEL: atomicrmw_sub_i32_release: 20602; RV64IA-WMO: # %bb.0: 20603; RV64IA-WMO-NEXT: neg a1, a1 20604; RV64IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0) 20605; RV64IA-WMO-NEXT: ret 20606; 20607; RV64IA-TSO-LABEL: atomicrmw_sub_i32_release: 20608; RV64IA-TSO: # %bb.0: 20609; RV64IA-TSO-NEXT: neg a1, a1 20610; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20611; RV64IA-TSO-NEXT: ret 20612 %1 = atomicrmw sub ptr %a, i32 %b release 20613 ret i32 %1 20614} 20615 20616define i32 @atomicrmw_sub_i32_acq_rel(ptr %a, i32 %b) nounwind { 20617; RV32I-LABEL: atomicrmw_sub_i32_acq_rel: 20618; RV32I: # %bb.0: 20619; RV32I-NEXT: addi sp, sp, -16 20620; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20621; RV32I-NEXT: li a2, 4 20622; RV32I-NEXT: call __atomic_fetch_sub_4 20623; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20624; RV32I-NEXT: addi sp, sp, 16 20625; RV32I-NEXT: ret 20626; 20627; RV32IA-WMO-LABEL: atomicrmw_sub_i32_acq_rel: 20628; RV32IA-WMO: # %bb.0: 20629; RV32IA-WMO-NEXT: neg a1, a1 20630; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20631; RV32IA-WMO-NEXT: ret 20632; 20633; RV32IA-TSO-LABEL: atomicrmw_sub_i32_acq_rel: 20634; RV32IA-TSO: # %bb.0: 20635; RV32IA-TSO-NEXT: neg a1, a1 20636; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20637; RV32IA-TSO-NEXT: ret 20638; 20639; RV64I-LABEL: atomicrmw_sub_i32_acq_rel: 20640; RV64I: # %bb.0: 20641; RV64I-NEXT: addi sp, sp, -16 20642; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20643; RV64I-NEXT: li a2, 4 20644; RV64I-NEXT: call __atomic_fetch_sub_4 20645; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20646; RV64I-NEXT: addi sp, sp, 16 20647; RV64I-NEXT: ret 20648; 20649; RV64IA-WMO-LABEL: atomicrmw_sub_i32_acq_rel: 20650; RV64IA-WMO: # %bb.0: 20651; RV64IA-WMO-NEXT: neg a1, a1 20652; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20653; RV64IA-WMO-NEXT: ret 20654; 20655; RV64IA-TSO-LABEL: atomicrmw_sub_i32_acq_rel: 20656; RV64IA-TSO: # %bb.0: 20657; RV64IA-TSO-NEXT: neg a1, a1 20658; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20659; RV64IA-TSO-NEXT: ret 20660 %1 = atomicrmw sub ptr %a, i32 %b acq_rel 20661 ret i32 %1 20662} 20663 20664define i32 @atomicrmw_sub_i32_seq_cst(ptr %a, i32 %b) nounwind { 20665; RV32I-LABEL: atomicrmw_sub_i32_seq_cst: 20666; RV32I: # %bb.0: 20667; RV32I-NEXT: addi sp, sp, -16 20668; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20669; RV32I-NEXT: li a2, 5 20670; RV32I-NEXT: call __atomic_fetch_sub_4 20671; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20672; RV32I-NEXT: addi sp, sp, 16 20673; RV32I-NEXT: ret 20674; 20675; RV32IA-WMO-LABEL: atomicrmw_sub_i32_seq_cst: 20676; RV32IA-WMO: # %bb.0: 20677; RV32IA-WMO-NEXT: neg a1, a1 20678; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20679; RV32IA-WMO-NEXT: ret 20680; 20681; RV32IA-TSO-LABEL: atomicrmw_sub_i32_seq_cst: 20682; RV32IA-TSO: # %bb.0: 20683; RV32IA-TSO-NEXT: neg a1, a1 20684; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20685; RV32IA-TSO-NEXT: ret 20686; 20687; RV64I-LABEL: atomicrmw_sub_i32_seq_cst: 20688; RV64I: # %bb.0: 20689; RV64I-NEXT: addi sp, sp, -16 20690; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20691; RV64I-NEXT: li a2, 5 20692; RV64I-NEXT: call __atomic_fetch_sub_4 20693; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20694; RV64I-NEXT: addi sp, sp, 16 20695; RV64I-NEXT: ret 20696; 20697; RV64IA-WMO-LABEL: atomicrmw_sub_i32_seq_cst: 20698; RV64IA-WMO: # %bb.0: 20699; RV64IA-WMO-NEXT: neg a1, a1 20700; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0) 20701; RV64IA-WMO-NEXT: ret 20702; 20703; RV64IA-TSO-LABEL: atomicrmw_sub_i32_seq_cst: 20704; RV64IA-TSO: # %bb.0: 20705; RV64IA-TSO-NEXT: neg a1, a1 20706; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0) 20707; RV64IA-TSO-NEXT: ret 20708 %1 = atomicrmw sub ptr %a, i32 %b seq_cst 20709 ret i32 %1 20710} 20711 20712define i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind { 20713; RV32I-LABEL: atomicrmw_and_i32_monotonic: 20714; RV32I: # %bb.0: 20715; RV32I-NEXT: addi sp, sp, -16 20716; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20717; RV32I-NEXT: li a2, 0 20718; RV32I-NEXT: call __atomic_fetch_and_4 20719; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20720; RV32I-NEXT: addi sp, sp, 16 20721; RV32I-NEXT: ret 20722; 20723; RV32IA-LABEL: atomicrmw_and_i32_monotonic: 20724; RV32IA: # %bb.0: 20725; RV32IA-NEXT: amoand.w a0, a1, (a0) 20726; RV32IA-NEXT: ret 20727; 20728; RV64I-LABEL: atomicrmw_and_i32_monotonic: 20729; RV64I: # %bb.0: 20730; RV64I-NEXT: addi sp, sp, -16 20731; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20732; RV64I-NEXT: li a2, 0 20733; RV64I-NEXT: call __atomic_fetch_and_4 20734; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20735; RV64I-NEXT: addi sp, sp, 16 20736; RV64I-NEXT: ret 20737; 20738; RV64IA-LABEL: atomicrmw_and_i32_monotonic: 20739; RV64IA: # %bb.0: 20740; RV64IA-NEXT: amoand.w a0, a1, (a0) 20741; RV64IA-NEXT: ret 20742 %1 = atomicrmw and ptr %a, i32 %b monotonic 20743 ret i32 %1 20744} 20745 20746define i32 @atomicrmw_and_i32_acquire(ptr %a, i32 %b) nounwind { 20747; RV32I-LABEL: atomicrmw_and_i32_acquire: 20748; RV32I: # %bb.0: 20749; RV32I-NEXT: addi sp, sp, -16 20750; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20751; RV32I-NEXT: li a2, 2 20752; RV32I-NEXT: call __atomic_fetch_and_4 20753; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20754; RV32I-NEXT: addi sp, sp, 16 20755; RV32I-NEXT: ret 20756; 20757; RV32IA-WMO-LABEL: atomicrmw_and_i32_acquire: 20758; RV32IA-WMO: # %bb.0: 20759; RV32IA-WMO-NEXT: amoand.w.aq a0, a1, (a0) 20760; RV32IA-WMO-NEXT: ret 20761; 20762; RV32IA-TSO-LABEL: atomicrmw_and_i32_acquire: 20763; RV32IA-TSO: # %bb.0: 20764; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0) 20765; RV32IA-TSO-NEXT: ret 20766; 20767; RV64I-LABEL: atomicrmw_and_i32_acquire: 20768; RV64I: # %bb.0: 20769; RV64I-NEXT: addi sp, sp, -16 20770; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20771; RV64I-NEXT: li a2, 2 20772; RV64I-NEXT: call __atomic_fetch_and_4 20773; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20774; RV64I-NEXT: addi sp, sp, 16 20775; RV64I-NEXT: ret 20776; 20777; RV64IA-WMO-LABEL: atomicrmw_and_i32_acquire: 20778; RV64IA-WMO: # %bb.0: 20779; RV64IA-WMO-NEXT: amoand.w.aq a0, a1, (a0) 20780; RV64IA-WMO-NEXT: ret 20781; 20782; RV64IA-TSO-LABEL: atomicrmw_and_i32_acquire: 20783; RV64IA-TSO: # %bb.0: 20784; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0) 20785; RV64IA-TSO-NEXT: ret 20786 %1 = atomicrmw and ptr %a, i32 %b acquire 20787 ret i32 %1 20788} 20789 20790define i32 @atomicrmw_and_i32_release(ptr %a, i32 %b) nounwind { 20791; RV32I-LABEL: atomicrmw_and_i32_release: 20792; RV32I: # %bb.0: 20793; RV32I-NEXT: addi sp, sp, -16 20794; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20795; RV32I-NEXT: li a2, 3 20796; RV32I-NEXT: call __atomic_fetch_and_4 20797; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20798; RV32I-NEXT: addi sp, sp, 16 20799; RV32I-NEXT: ret 20800; 20801; RV32IA-WMO-LABEL: atomicrmw_and_i32_release: 20802; RV32IA-WMO: # %bb.0: 20803; RV32IA-WMO-NEXT: amoand.w.rl a0, a1, (a0) 20804; RV32IA-WMO-NEXT: ret 20805; 20806; RV32IA-TSO-LABEL: atomicrmw_and_i32_release: 20807; RV32IA-TSO: # %bb.0: 20808; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0) 20809; RV32IA-TSO-NEXT: ret 20810; 20811; RV64I-LABEL: atomicrmw_and_i32_release: 20812; RV64I: # %bb.0: 20813; RV64I-NEXT: addi sp, sp, -16 20814; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20815; RV64I-NEXT: li a2, 3 20816; RV64I-NEXT: call __atomic_fetch_and_4 20817; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20818; RV64I-NEXT: addi sp, sp, 16 20819; RV64I-NEXT: ret 20820; 20821; RV64IA-WMO-LABEL: atomicrmw_and_i32_release: 20822; RV64IA-WMO: # %bb.0: 20823; RV64IA-WMO-NEXT: amoand.w.rl a0, a1, (a0) 20824; RV64IA-WMO-NEXT: ret 20825; 20826; RV64IA-TSO-LABEL: atomicrmw_and_i32_release: 20827; RV64IA-TSO: # %bb.0: 20828; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0) 20829; RV64IA-TSO-NEXT: ret 20830 %1 = atomicrmw and ptr %a, i32 %b release 20831 ret i32 %1 20832} 20833 20834define i32 @atomicrmw_and_i32_acq_rel(ptr %a, i32 %b) nounwind { 20835; RV32I-LABEL: atomicrmw_and_i32_acq_rel: 20836; RV32I: # %bb.0: 20837; RV32I-NEXT: addi sp, sp, -16 20838; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20839; RV32I-NEXT: li a2, 4 20840; RV32I-NEXT: call __atomic_fetch_and_4 20841; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20842; RV32I-NEXT: addi sp, sp, 16 20843; RV32I-NEXT: ret 20844; 20845; RV32IA-WMO-LABEL: atomicrmw_and_i32_acq_rel: 20846; RV32IA-WMO: # %bb.0: 20847; RV32IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0) 20848; RV32IA-WMO-NEXT: ret 20849; 20850; RV32IA-TSO-LABEL: atomicrmw_and_i32_acq_rel: 20851; RV32IA-TSO: # %bb.0: 20852; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0) 20853; RV32IA-TSO-NEXT: ret 20854; 20855; RV64I-LABEL: atomicrmw_and_i32_acq_rel: 20856; RV64I: # %bb.0: 20857; RV64I-NEXT: addi sp, sp, -16 20858; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20859; RV64I-NEXT: li a2, 4 20860; RV64I-NEXT: call __atomic_fetch_and_4 20861; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20862; RV64I-NEXT: addi sp, sp, 16 20863; RV64I-NEXT: ret 20864; 20865; RV64IA-WMO-LABEL: atomicrmw_and_i32_acq_rel: 20866; RV64IA-WMO: # %bb.0: 20867; RV64IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0) 20868; RV64IA-WMO-NEXT: ret 20869; 20870; RV64IA-TSO-LABEL: atomicrmw_and_i32_acq_rel: 20871; RV64IA-TSO: # %bb.0: 20872; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0) 20873; RV64IA-TSO-NEXT: ret 20874 %1 = atomicrmw and ptr %a, i32 %b acq_rel 20875 ret i32 %1 20876} 20877 20878define i32 @atomicrmw_and_i32_seq_cst(ptr %a, i32 %b) nounwind { 20879; RV32I-LABEL: atomicrmw_and_i32_seq_cst: 20880; RV32I: # %bb.0: 20881; RV32I-NEXT: addi sp, sp, -16 20882; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20883; RV32I-NEXT: li a2, 5 20884; RV32I-NEXT: call __atomic_fetch_and_4 20885; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20886; RV32I-NEXT: addi sp, sp, 16 20887; RV32I-NEXT: ret 20888; 20889; RV32IA-WMO-LABEL: atomicrmw_and_i32_seq_cst: 20890; RV32IA-WMO: # %bb.0: 20891; RV32IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0) 20892; RV32IA-WMO-NEXT: ret 20893; 20894; RV32IA-TSO-LABEL: atomicrmw_and_i32_seq_cst: 20895; RV32IA-TSO: # %bb.0: 20896; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0) 20897; RV32IA-TSO-NEXT: ret 20898; 20899; RV64I-LABEL: atomicrmw_and_i32_seq_cst: 20900; RV64I: # %bb.0: 20901; RV64I-NEXT: addi sp, sp, -16 20902; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20903; RV64I-NEXT: li a2, 5 20904; RV64I-NEXT: call __atomic_fetch_and_4 20905; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20906; RV64I-NEXT: addi sp, sp, 16 20907; RV64I-NEXT: ret 20908; 20909; RV64IA-WMO-LABEL: atomicrmw_and_i32_seq_cst: 20910; RV64IA-WMO: # %bb.0: 20911; RV64IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0) 20912; RV64IA-WMO-NEXT: ret 20913; 20914; RV64IA-TSO-LABEL: atomicrmw_and_i32_seq_cst: 20915; RV64IA-TSO: # %bb.0: 20916; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0) 20917; RV64IA-TSO-NEXT: ret 20918 %1 = atomicrmw and ptr %a, i32 %b seq_cst 20919 ret i32 %1 20920} 20921 20922define i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind { 20923; RV32I-LABEL: atomicrmw_nand_i32_monotonic: 20924; RV32I: # %bb.0: 20925; RV32I-NEXT: addi sp, sp, -16 20926; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 20927; RV32I-NEXT: li a2, 0 20928; RV32I-NEXT: call __atomic_fetch_nand_4 20929; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 20930; RV32I-NEXT: addi sp, sp, 16 20931; RV32I-NEXT: ret 20932; 20933; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic: 20934; RV32IA-NOZACAS: # %bb.0: 20935; RV32IA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1 20936; RV32IA-NOZACAS-NEXT: lr.w a2, (a0) 20937; RV32IA-NOZACAS-NEXT: and a3, a2, a1 20938; RV32IA-NOZACAS-NEXT: not a3, a3 20939; RV32IA-NOZACAS-NEXT: sc.w a3, a3, (a0) 20940; RV32IA-NOZACAS-NEXT: bnez a3, .LBB150_1 20941; RV32IA-NOZACAS-NEXT: # %bb.2: 20942; RV32IA-NOZACAS-NEXT: mv a0, a2 20943; RV32IA-NOZACAS-NEXT: ret 20944; 20945; RV64I-LABEL: atomicrmw_nand_i32_monotonic: 20946; RV64I: # %bb.0: 20947; RV64I-NEXT: addi sp, sp, -16 20948; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 20949; RV64I-NEXT: li a2, 0 20950; RV64I-NEXT: call __atomic_fetch_nand_4 20951; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20952; RV64I-NEXT: addi sp, sp, 16 20953; RV64I-NEXT: ret 20954; 20955; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic: 20956; RV64IA-NOZACAS: # %bb.0: 20957; RV64IA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1 20958; RV64IA-NOZACAS-NEXT: lr.w a2, (a0) 20959; RV64IA-NOZACAS-NEXT: and a3, a2, a1 20960; RV64IA-NOZACAS-NEXT: not a3, a3 20961; RV64IA-NOZACAS-NEXT: sc.w a3, a3, (a0) 20962; RV64IA-NOZACAS-NEXT: bnez a3, .LBB150_1 20963; RV64IA-NOZACAS-NEXT: # %bb.2: 20964; RV64IA-NOZACAS-NEXT: mv a0, a2 20965; RV64IA-NOZACAS-NEXT: ret 20966; 20967; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic: 20968; RV32IA-ZACAS: # %bb.0: 20969; RV32IA-ZACAS-NEXT: mv a2, a0 20970; RV32IA-ZACAS-NEXT: lw a0, 0(a0) 20971; RV32IA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start 20972; RV32IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 20973; RV32IA-ZACAS-NEXT: mv a3, a0 20974; RV32IA-ZACAS-NEXT: and a4, a0, a1 20975; RV32IA-ZACAS-NEXT: not a4, a4 20976; RV32IA-ZACAS-NEXT: amocas.w a0, a4, (a2) 20977; RV32IA-ZACAS-NEXT: bne a0, a3, .LBB150_1 20978; RV32IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 20979; RV32IA-ZACAS-NEXT: ret 20980; 20981; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic: 20982; RV64IA-ZACAS: # %bb.0: 20983; RV64IA-ZACAS-NEXT: mv a2, a0 20984; RV64IA-ZACAS-NEXT: lw a0, 0(a0) 20985; RV64IA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start 20986; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 20987; RV64IA-ZACAS-NEXT: mv a3, a0 20988; RV64IA-ZACAS-NEXT: and a4, a0, a1 20989; RV64IA-ZACAS-NEXT: not a4, a4 20990; RV64IA-ZACAS-NEXT: amocas.w a0, a4, (a2) 20991; RV64IA-ZACAS-NEXT: bne a0, a3, .LBB150_1 20992; RV64IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 20993; RV64IA-ZACAS-NEXT: ret 20994; 20995; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic: 20996; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 20997; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1 20998; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0) 20999; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21000; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 21001; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0) 21002; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB150_1 21003; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 21004; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 21005; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 21006; 21007; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic: 21008; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 21009; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1 21010; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0) 21011; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21012; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 21013; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0) 21014; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB150_1 21015; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 21016; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 21017; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 21018; 21019; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic: 21020; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 21021; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 21022; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21023; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start 21024; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21025; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 21026; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21027; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 21028; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2) 21029; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB150_1 21030; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21031; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 21032; 21033; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic: 21034; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 21035; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 21036; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21037; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start 21038; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21039; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 21040; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21041; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 21042; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2) 21043; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB150_1 21044; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21045; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 21046 %1 = atomicrmw nand ptr %a, i32 %b monotonic 21047 ret i32 %1 21048} 21049 21050define i32 @atomicrmw_nand_i32_acquire(ptr %a, i32 %b) nounwind { 21051; RV32I-LABEL: atomicrmw_nand_i32_acquire: 21052; RV32I: # %bb.0: 21053; RV32I-NEXT: addi sp, sp, -16 21054; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21055; RV32I-NEXT: li a2, 2 21056; RV32I-NEXT: call __atomic_fetch_nand_4 21057; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21058; RV32I-NEXT: addi sp, sp, 16 21059; RV32I-NEXT: ret 21060; 21061; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire: 21062; RV32IA-WMO-NOZACAS: # %bb.0: 21063; RV32IA-WMO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1 21064; RV32IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0) 21065; RV32IA-WMO-NOZACAS-NEXT: and a3, a2, a1 21066; RV32IA-WMO-NOZACAS-NEXT: not a3, a3 21067; RV32IA-WMO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21068; RV32IA-WMO-NOZACAS-NEXT: bnez a3, .LBB151_1 21069; RV32IA-WMO-NOZACAS-NEXT: # %bb.2: 21070; RV32IA-WMO-NOZACAS-NEXT: mv a0, a2 21071; RV32IA-WMO-NOZACAS-NEXT: ret 21072; 21073; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire: 21074; RV32IA-TSO-NOZACAS: # %bb.0: 21075; RV32IA-TSO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1 21076; RV32IA-TSO-NOZACAS-NEXT: lr.w a2, (a0) 21077; RV32IA-TSO-NOZACAS-NEXT: and a3, a2, a1 21078; RV32IA-TSO-NOZACAS-NEXT: not a3, a3 21079; RV32IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21080; RV32IA-TSO-NOZACAS-NEXT: bnez a3, .LBB151_1 21081; RV32IA-TSO-NOZACAS-NEXT: # %bb.2: 21082; RV32IA-TSO-NOZACAS-NEXT: mv a0, a2 21083; RV32IA-TSO-NOZACAS-NEXT: ret 21084; 21085; RV64I-LABEL: atomicrmw_nand_i32_acquire: 21086; RV64I: # %bb.0: 21087; RV64I-NEXT: addi sp, sp, -16 21088; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21089; RV64I-NEXT: li a2, 2 21090; RV64I-NEXT: call __atomic_fetch_nand_4 21091; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21092; RV64I-NEXT: addi sp, sp, 16 21093; RV64I-NEXT: ret 21094; 21095; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire: 21096; RV64IA-WMO-NOZACAS: # %bb.0: 21097; RV64IA-WMO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1 21098; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0) 21099; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1 21100; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 21101; RV64IA-WMO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21102; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB151_1 21103; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 21104; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2 21105; RV64IA-WMO-NOZACAS-NEXT: ret 21106; 21107; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire: 21108; RV64IA-TSO-NOZACAS: # %bb.0: 21109; RV64IA-TSO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1 21110; RV64IA-TSO-NOZACAS-NEXT: lr.w a2, (a0) 21111; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1 21112; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 21113; RV64IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21114; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB151_1 21115; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 21116; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2 21117; RV64IA-TSO-NOZACAS-NEXT: ret 21118; 21119; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acquire: 21120; RV32IA-WMO-ZACAS: # %bb.0: 21121; RV32IA-WMO-ZACAS-NEXT: mv a2, a0 21122; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21123; RV32IA-WMO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start 21124; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21125; RV32IA-WMO-ZACAS-NEXT: mv a3, a0 21126; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1 21127; RV32IA-WMO-ZACAS-NEXT: not a4, a4 21128; RV32IA-WMO-ZACAS-NEXT: amocas.w.aq a0, a4, (a2) 21129; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB151_1 21130; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21131; RV32IA-WMO-ZACAS-NEXT: ret 21132; 21133; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acquire: 21134; RV32IA-TSO-ZACAS: # %bb.0: 21135; RV32IA-TSO-ZACAS-NEXT: mv a2, a0 21136; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21137; RV32IA-TSO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start 21138; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21139; RV32IA-TSO-ZACAS-NEXT: mv a3, a0 21140; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1 21141; RV32IA-TSO-ZACAS-NEXT: not a4, a4 21142; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21143; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB151_1 21144; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21145; RV32IA-TSO-ZACAS-NEXT: ret 21146; 21147; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acquire: 21148; RV64IA-WMO-ZACAS: # %bb.0: 21149; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 21150; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21151; RV64IA-WMO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start 21152; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21153; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 21154; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 21155; RV64IA-WMO-ZACAS-NEXT: not a4, a4 21156; RV64IA-WMO-ZACAS-NEXT: amocas.w.aq a0, a4, (a2) 21157; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB151_1 21158; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21159; RV64IA-WMO-ZACAS-NEXT: ret 21160; 21161; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acquire: 21162; RV64IA-TSO-ZACAS: # %bb.0: 21163; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 21164; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21165; RV64IA-TSO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start 21166; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21167; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 21168; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 21169; RV64IA-TSO-ZACAS-NEXT: not a4, a4 21170; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21171; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB151_1 21172; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21173; RV64IA-TSO-ZACAS-NEXT: ret 21174; 21175; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acquire: 21176; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 21177; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1 21178; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a2, (a0) 21179; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21180; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 21181; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0) 21182; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB151_1 21183; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 21184; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 21185; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 21186; 21187; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acquire: 21188; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 21189; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1 21190; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0) 21191; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21192; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 21193; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0) 21194; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB151_1 21195; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 21196; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 21197; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 21198; 21199; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acquire: 21200; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 21201; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 21202; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21203; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start 21204; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21205; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 21206; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21207; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 21208; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aq a0, a4, (a2) 21209; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB151_1 21210; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21211; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 21212; 21213; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acquire: 21214; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 21215; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 21216; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21217; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start 21218; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21219; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 21220; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21221; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 21222; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2) 21223; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB151_1 21224; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21225; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 21226 %1 = atomicrmw nand ptr %a, i32 %b acquire 21227 ret i32 %1 21228} 21229 21230define i32 @atomicrmw_nand_i32_release(ptr %a, i32 %b) nounwind { 21231; RV32I-LABEL: atomicrmw_nand_i32_release: 21232; RV32I: # %bb.0: 21233; RV32I-NEXT: addi sp, sp, -16 21234; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21235; RV32I-NEXT: li a2, 3 21236; RV32I-NEXT: call __atomic_fetch_nand_4 21237; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21238; RV32I-NEXT: addi sp, sp, 16 21239; RV32I-NEXT: ret 21240; 21241; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_release: 21242; RV32IA-WMO-NOZACAS: # %bb.0: 21243; RV32IA-WMO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1 21244; RV32IA-WMO-NOZACAS-NEXT: lr.w a2, (a0) 21245; RV32IA-WMO-NOZACAS-NEXT: and a3, a2, a1 21246; RV32IA-WMO-NOZACAS-NEXT: not a3, a3 21247; RV32IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21248; RV32IA-WMO-NOZACAS-NEXT: bnez a3, .LBB152_1 21249; RV32IA-WMO-NOZACAS-NEXT: # %bb.2: 21250; RV32IA-WMO-NOZACAS-NEXT: mv a0, a2 21251; RV32IA-WMO-NOZACAS-NEXT: ret 21252; 21253; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_release: 21254; RV32IA-TSO-NOZACAS: # %bb.0: 21255; RV32IA-TSO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1 21256; RV32IA-TSO-NOZACAS-NEXT: lr.w a2, (a0) 21257; RV32IA-TSO-NOZACAS-NEXT: and a3, a2, a1 21258; RV32IA-TSO-NOZACAS-NEXT: not a3, a3 21259; RV32IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21260; RV32IA-TSO-NOZACAS-NEXT: bnez a3, .LBB152_1 21261; RV32IA-TSO-NOZACAS-NEXT: # %bb.2: 21262; RV32IA-TSO-NOZACAS-NEXT: mv a0, a2 21263; RV32IA-TSO-NOZACAS-NEXT: ret 21264; 21265; RV64I-LABEL: atomicrmw_nand_i32_release: 21266; RV64I: # %bb.0: 21267; RV64I-NEXT: addi sp, sp, -16 21268; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21269; RV64I-NEXT: li a2, 3 21270; RV64I-NEXT: call __atomic_fetch_nand_4 21271; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21272; RV64I-NEXT: addi sp, sp, 16 21273; RV64I-NEXT: ret 21274; 21275; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_release: 21276; RV64IA-WMO-NOZACAS: # %bb.0: 21277; RV64IA-WMO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1 21278; RV64IA-WMO-NOZACAS-NEXT: lr.w a2, (a0) 21279; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1 21280; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 21281; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21282; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB152_1 21283; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 21284; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2 21285; RV64IA-WMO-NOZACAS-NEXT: ret 21286; 21287; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_release: 21288; RV64IA-TSO-NOZACAS: # %bb.0: 21289; RV64IA-TSO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1 21290; RV64IA-TSO-NOZACAS-NEXT: lr.w a2, (a0) 21291; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1 21292; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 21293; RV64IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21294; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB152_1 21295; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 21296; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2 21297; RV64IA-TSO-NOZACAS-NEXT: ret 21298; 21299; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_release: 21300; RV32IA-WMO-ZACAS: # %bb.0: 21301; RV32IA-WMO-ZACAS-NEXT: mv a2, a0 21302; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21303; RV32IA-WMO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start 21304; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21305; RV32IA-WMO-ZACAS-NEXT: mv a3, a0 21306; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1 21307; RV32IA-WMO-ZACAS-NEXT: not a4, a4 21308; RV32IA-WMO-ZACAS-NEXT: amocas.w.rl a0, a4, (a2) 21309; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB152_1 21310; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21311; RV32IA-WMO-ZACAS-NEXT: ret 21312; 21313; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_release: 21314; RV32IA-TSO-ZACAS: # %bb.0: 21315; RV32IA-TSO-ZACAS-NEXT: mv a2, a0 21316; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21317; RV32IA-TSO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start 21318; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21319; RV32IA-TSO-ZACAS-NEXT: mv a3, a0 21320; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1 21321; RV32IA-TSO-ZACAS-NEXT: not a4, a4 21322; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21323; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB152_1 21324; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21325; RV32IA-TSO-ZACAS-NEXT: ret 21326; 21327; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_release: 21328; RV64IA-WMO-ZACAS: # %bb.0: 21329; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 21330; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21331; RV64IA-WMO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start 21332; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21333; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 21334; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 21335; RV64IA-WMO-ZACAS-NEXT: not a4, a4 21336; RV64IA-WMO-ZACAS-NEXT: amocas.w.rl a0, a4, (a2) 21337; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB152_1 21338; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21339; RV64IA-WMO-ZACAS-NEXT: ret 21340; 21341; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_release: 21342; RV64IA-TSO-ZACAS: # %bb.0: 21343; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 21344; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21345; RV64IA-TSO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start 21346; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21347; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 21348; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 21349; RV64IA-TSO-ZACAS-NEXT: not a4, a4 21350; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21351; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB152_1 21352; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21353; RV64IA-TSO-ZACAS-NEXT: ret 21354; 21355; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_release: 21356; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 21357; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1 21358; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0) 21359; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21360; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 21361; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21362; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB152_1 21363; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 21364; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 21365; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 21366; 21367; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_release: 21368; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 21369; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1 21370; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0) 21371; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21372; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 21373; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0) 21374; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB152_1 21375; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 21376; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 21377; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 21378; 21379; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_release: 21380; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 21381; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 21382; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21383; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start 21384; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21385; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 21386; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21387; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 21388; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.rl a0, a4, (a2) 21389; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB152_1 21390; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21391; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 21392; 21393; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_release: 21394; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 21395; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 21396; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21397; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start 21398; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21399; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 21400; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21401; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 21402; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2) 21403; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB152_1 21404; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21405; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 21406 %1 = atomicrmw nand ptr %a, i32 %b release 21407 ret i32 %1 21408} 21409 21410define i32 @atomicrmw_nand_i32_acq_rel(ptr %a, i32 %b) nounwind { 21411; RV32I-LABEL: atomicrmw_nand_i32_acq_rel: 21412; RV32I: # %bb.0: 21413; RV32I-NEXT: addi sp, sp, -16 21414; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21415; RV32I-NEXT: li a2, 4 21416; RV32I-NEXT: call __atomic_fetch_nand_4 21417; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21418; RV32I-NEXT: addi sp, sp, 16 21419; RV32I-NEXT: ret 21420; 21421; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21422; RV32IA-WMO-NOZACAS: # %bb.0: 21423; RV32IA-WMO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1 21424; RV32IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0) 21425; RV32IA-WMO-NOZACAS-NEXT: and a3, a2, a1 21426; RV32IA-WMO-NOZACAS-NEXT: not a3, a3 21427; RV32IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21428; RV32IA-WMO-NOZACAS-NEXT: bnez a3, .LBB153_1 21429; RV32IA-WMO-NOZACAS-NEXT: # %bb.2: 21430; RV32IA-WMO-NOZACAS-NEXT: mv a0, a2 21431; RV32IA-WMO-NOZACAS-NEXT: ret 21432; 21433; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21434; RV32IA-TSO-NOZACAS: # %bb.0: 21435; RV32IA-TSO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1 21436; RV32IA-TSO-NOZACAS-NEXT: lr.w a2, (a0) 21437; RV32IA-TSO-NOZACAS-NEXT: and a3, a2, a1 21438; RV32IA-TSO-NOZACAS-NEXT: not a3, a3 21439; RV32IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21440; RV32IA-TSO-NOZACAS-NEXT: bnez a3, .LBB153_1 21441; RV32IA-TSO-NOZACAS-NEXT: # %bb.2: 21442; RV32IA-TSO-NOZACAS-NEXT: mv a0, a2 21443; RV32IA-TSO-NOZACAS-NEXT: ret 21444; 21445; RV64I-LABEL: atomicrmw_nand_i32_acq_rel: 21446; RV64I: # %bb.0: 21447; RV64I-NEXT: addi sp, sp, -16 21448; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21449; RV64I-NEXT: li a2, 4 21450; RV64I-NEXT: call __atomic_fetch_nand_4 21451; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21452; RV64I-NEXT: addi sp, sp, 16 21453; RV64I-NEXT: ret 21454; 21455; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21456; RV64IA-WMO-NOZACAS: # %bb.0: 21457; RV64IA-WMO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1 21458; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0) 21459; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1 21460; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 21461; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21462; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB153_1 21463; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 21464; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2 21465; RV64IA-WMO-NOZACAS-NEXT: ret 21466; 21467; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21468; RV64IA-TSO-NOZACAS: # %bb.0: 21469; RV64IA-TSO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1 21470; RV64IA-TSO-NOZACAS-NEXT: lr.w a2, (a0) 21471; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1 21472; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 21473; RV64IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0) 21474; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB153_1 21475; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 21476; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2 21477; RV64IA-TSO-NOZACAS-NEXT: ret 21478; 21479; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21480; RV32IA-WMO-ZACAS: # %bb.0: 21481; RV32IA-WMO-ZACAS-NEXT: mv a2, a0 21482; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21483; RV32IA-WMO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start 21484; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21485; RV32IA-WMO-ZACAS-NEXT: mv a3, a0 21486; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1 21487; RV32IA-WMO-ZACAS-NEXT: not a4, a4 21488; RV32IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2) 21489; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB153_1 21490; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21491; RV32IA-WMO-ZACAS-NEXT: ret 21492; 21493; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21494; RV32IA-TSO-ZACAS: # %bb.0: 21495; RV32IA-TSO-ZACAS-NEXT: mv a2, a0 21496; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21497; RV32IA-TSO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start 21498; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21499; RV32IA-TSO-ZACAS-NEXT: mv a3, a0 21500; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1 21501; RV32IA-TSO-ZACAS-NEXT: not a4, a4 21502; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21503; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB153_1 21504; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21505; RV32IA-TSO-ZACAS-NEXT: ret 21506; 21507; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21508; RV64IA-WMO-ZACAS: # %bb.0: 21509; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 21510; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21511; RV64IA-WMO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start 21512; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21513; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 21514; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 21515; RV64IA-WMO-ZACAS-NEXT: not a4, a4 21516; RV64IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2) 21517; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB153_1 21518; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21519; RV64IA-WMO-ZACAS-NEXT: ret 21520; 21521; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21522; RV64IA-TSO-ZACAS: # %bb.0: 21523; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 21524; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21525; RV64IA-TSO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start 21526; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21527; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 21528; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 21529; RV64IA-TSO-ZACAS-NEXT: not a4, a4 21530; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21531; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB153_1 21532; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21533; RV64IA-TSO-ZACAS-NEXT: ret 21534; 21535; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21536; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 21537; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1 21538; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a2, (a0) 21539; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21540; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 21541; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21542; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB153_1 21543; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 21544; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 21545; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 21546; 21547; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21548; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 21549; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1 21550; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0) 21551; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21552; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 21553; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0) 21554; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB153_1 21555; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 21556; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 21557; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 21558; 21559; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21560; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 21561; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 21562; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21563; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start 21564; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21565; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 21566; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21567; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 21568; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2) 21569; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB153_1 21570; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21571; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 21572; 21573; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel: 21574; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 21575; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 21576; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21577; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start 21578; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21579; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 21580; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21581; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 21582; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2) 21583; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB153_1 21584; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21585; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 21586 %1 = atomicrmw nand ptr %a, i32 %b acq_rel 21587 ret i32 %1 21588} 21589 21590define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind { 21591; RV32I-LABEL: atomicrmw_nand_i32_seq_cst: 21592; RV32I: # %bb.0: 21593; RV32I-NEXT: addi sp, sp, -16 21594; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21595; RV32I-NEXT: li a2, 5 21596; RV32I-NEXT: call __atomic_fetch_nand_4 21597; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21598; RV32I-NEXT: addi sp, sp, 16 21599; RV32I-NEXT: ret 21600; 21601; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21602; RV32IA-NOZACAS: # %bb.0: 21603; RV32IA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1 21604; RV32IA-NOZACAS-NEXT: lr.w.aqrl a2, (a0) 21605; RV32IA-NOZACAS-NEXT: and a3, a2, a1 21606; RV32IA-NOZACAS-NEXT: not a3, a3 21607; RV32IA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21608; RV32IA-NOZACAS-NEXT: bnez a3, .LBB154_1 21609; RV32IA-NOZACAS-NEXT: # %bb.2: 21610; RV32IA-NOZACAS-NEXT: mv a0, a2 21611; RV32IA-NOZACAS-NEXT: ret 21612; 21613; RV64I-LABEL: atomicrmw_nand_i32_seq_cst: 21614; RV64I: # %bb.0: 21615; RV64I-NEXT: addi sp, sp, -16 21616; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21617; RV64I-NEXT: li a2, 5 21618; RV64I-NEXT: call __atomic_fetch_nand_4 21619; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21620; RV64I-NEXT: addi sp, sp, 16 21621; RV64I-NEXT: ret 21622; 21623; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21624; RV64IA-NOZACAS: # %bb.0: 21625; RV64IA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1 21626; RV64IA-NOZACAS-NEXT: lr.w.aqrl a2, (a0) 21627; RV64IA-NOZACAS-NEXT: and a3, a2, a1 21628; RV64IA-NOZACAS-NEXT: not a3, a3 21629; RV64IA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21630; RV64IA-NOZACAS-NEXT: bnez a3, .LBB154_1 21631; RV64IA-NOZACAS-NEXT: # %bb.2: 21632; RV64IA-NOZACAS-NEXT: mv a0, a2 21633; RV64IA-NOZACAS-NEXT: ret 21634; 21635; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21636; RV32IA-WMO-ZACAS: # %bb.0: 21637; RV32IA-WMO-ZACAS-NEXT: mv a2, a0 21638; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21639; RV32IA-WMO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start 21640; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21641; RV32IA-WMO-ZACAS-NEXT: mv a3, a0 21642; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1 21643; RV32IA-WMO-ZACAS-NEXT: not a4, a4 21644; RV32IA-WMO-ZACAS-NEXT: fence rw, rw 21645; RV32IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2) 21646; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB154_1 21647; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21648; RV32IA-WMO-ZACAS-NEXT: ret 21649; 21650; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21651; RV32IA-TSO-ZACAS: # %bb.0: 21652; RV32IA-TSO-ZACAS-NEXT: mv a2, a0 21653; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21654; RV32IA-TSO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start 21655; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21656; RV32IA-TSO-ZACAS-NEXT: mv a3, a0 21657; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1 21658; RV32IA-TSO-ZACAS-NEXT: not a4, a4 21659; RV32IA-TSO-ZACAS-NEXT: fence rw, rw 21660; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21661; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB154_1 21662; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21663; RV32IA-TSO-ZACAS-NEXT: ret 21664; 21665; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21666; RV64IA-WMO-ZACAS: # %bb.0: 21667; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 21668; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0) 21669; RV64IA-WMO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start 21670; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21671; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 21672; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 21673; RV64IA-WMO-ZACAS-NEXT: not a4, a4 21674; RV64IA-WMO-ZACAS-NEXT: fence rw, rw 21675; RV64IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2) 21676; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB154_1 21677; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21678; RV64IA-WMO-ZACAS-NEXT: ret 21679; 21680; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21681; RV64IA-TSO-ZACAS: # %bb.0: 21682; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 21683; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0) 21684; RV64IA-TSO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start 21685; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21686; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 21687; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 21688; RV64IA-TSO-ZACAS-NEXT: not a4, a4 21689; RV64IA-TSO-ZACAS-NEXT: fence rw, rw 21690; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2) 21691; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB154_1 21692; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21693; RV64IA-TSO-ZACAS-NEXT: ret 21694; 21695; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21696; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 21697; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1 21698; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a2, (a0) 21699; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21700; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 21701; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21702; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB154_1 21703; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 21704; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 21705; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 21706; 21707; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21708; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 21709; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1 21710; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a2, (a0) 21711; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 21712; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 21713; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0) 21714; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB154_1 21715; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 21716; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 21717; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 21718; 21719; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21720; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 21721; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 21722; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21723; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start 21724; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21725; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 21726; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21727; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 21728; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw 21729; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2) 21730; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB154_1 21731; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21732; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 21733; 21734; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst: 21735; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 21736; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 21737; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0) 21738; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start 21739; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 21740; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 21741; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 21742; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 21743; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw 21744; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2) 21745; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB154_1 21746; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 21747; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 21748 %1 = atomicrmw nand ptr %a, i32 %b seq_cst 21749 ret i32 %1 21750} 21751 21752define i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind { 21753; RV32I-LABEL: atomicrmw_or_i32_monotonic: 21754; RV32I: # %bb.0: 21755; RV32I-NEXT: addi sp, sp, -16 21756; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21757; RV32I-NEXT: li a2, 0 21758; RV32I-NEXT: call __atomic_fetch_or_4 21759; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21760; RV32I-NEXT: addi sp, sp, 16 21761; RV32I-NEXT: ret 21762; 21763; RV32IA-LABEL: atomicrmw_or_i32_monotonic: 21764; RV32IA: # %bb.0: 21765; RV32IA-NEXT: amoor.w a0, a1, (a0) 21766; RV32IA-NEXT: ret 21767; 21768; RV64I-LABEL: atomicrmw_or_i32_monotonic: 21769; RV64I: # %bb.0: 21770; RV64I-NEXT: addi sp, sp, -16 21771; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21772; RV64I-NEXT: li a2, 0 21773; RV64I-NEXT: call __atomic_fetch_or_4 21774; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21775; RV64I-NEXT: addi sp, sp, 16 21776; RV64I-NEXT: ret 21777; 21778; RV64IA-LABEL: atomicrmw_or_i32_monotonic: 21779; RV64IA: # %bb.0: 21780; RV64IA-NEXT: amoor.w a0, a1, (a0) 21781; RV64IA-NEXT: ret 21782 %1 = atomicrmw or ptr %a, i32 %b monotonic 21783 ret i32 %1 21784} 21785 21786define i32 @atomicrmw_or_i32_acquire(ptr %a, i32 %b) nounwind { 21787; RV32I-LABEL: atomicrmw_or_i32_acquire: 21788; RV32I: # %bb.0: 21789; RV32I-NEXT: addi sp, sp, -16 21790; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21791; RV32I-NEXT: li a2, 2 21792; RV32I-NEXT: call __atomic_fetch_or_4 21793; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21794; RV32I-NEXT: addi sp, sp, 16 21795; RV32I-NEXT: ret 21796; 21797; RV32IA-WMO-LABEL: atomicrmw_or_i32_acquire: 21798; RV32IA-WMO: # %bb.0: 21799; RV32IA-WMO-NEXT: amoor.w.aq a0, a1, (a0) 21800; RV32IA-WMO-NEXT: ret 21801; 21802; RV32IA-TSO-LABEL: atomicrmw_or_i32_acquire: 21803; RV32IA-TSO: # %bb.0: 21804; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0) 21805; RV32IA-TSO-NEXT: ret 21806; 21807; RV64I-LABEL: atomicrmw_or_i32_acquire: 21808; RV64I: # %bb.0: 21809; RV64I-NEXT: addi sp, sp, -16 21810; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21811; RV64I-NEXT: li a2, 2 21812; RV64I-NEXT: call __atomic_fetch_or_4 21813; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21814; RV64I-NEXT: addi sp, sp, 16 21815; RV64I-NEXT: ret 21816; 21817; RV64IA-WMO-LABEL: atomicrmw_or_i32_acquire: 21818; RV64IA-WMO: # %bb.0: 21819; RV64IA-WMO-NEXT: amoor.w.aq a0, a1, (a0) 21820; RV64IA-WMO-NEXT: ret 21821; 21822; RV64IA-TSO-LABEL: atomicrmw_or_i32_acquire: 21823; RV64IA-TSO: # %bb.0: 21824; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0) 21825; RV64IA-TSO-NEXT: ret 21826 %1 = atomicrmw or ptr %a, i32 %b acquire 21827 ret i32 %1 21828} 21829 21830define i32 @atomicrmw_or_i32_release(ptr %a, i32 %b) nounwind { 21831; RV32I-LABEL: atomicrmw_or_i32_release: 21832; RV32I: # %bb.0: 21833; RV32I-NEXT: addi sp, sp, -16 21834; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21835; RV32I-NEXT: li a2, 3 21836; RV32I-NEXT: call __atomic_fetch_or_4 21837; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21838; RV32I-NEXT: addi sp, sp, 16 21839; RV32I-NEXT: ret 21840; 21841; RV32IA-WMO-LABEL: atomicrmw_or_i32_release: 21842; RV32IA-WMO: # %bb.0: 21843; RV32IA-WMO-NEXT: amoor.w.rl a0, a1, (a0) 21844; RV32IA-WMO-NEXT: ret 21845; 21846; RV32IA-TSO-LABEL: atomicrmw_or_i32_release: 21847; RV32IA-TSO: # %bb.0: 21848; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0) 21849; RV32IA-TSO-NEXT: ret 21850; 21851; RV64I-LABEL: atomicrmw_or_i32_release: 21852; RV64I: # %bb.0: 21853; RV64I-NEXT: addi sp, sp, -16 21854; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21855; RV64I-NEXT: li a2, 3 21856; RV64I-NEXT: call __atomic_fetch_or_4 21857; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21858; RV64I-NEXT: addi sp, sp, 16 21859; RV64I-NEXT: ret 21860; 21861; RV64IA-WMO-LABEL: atomicrmw_or_i32_release: 21862; RV64IA-WMO: # %bb.0: 21863; RV64IA-WMO-NEXT: amoor.w.rl a0, a1, (a0) 21864; RV64IA-WMO-NEXT: ret 21865; 21866; RV64IA-TSO-LABEL: atomicrmw_or_i32_release: 21867; RV64IA-TSO: # %bb.0: 21868; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0) 21869; RV64IA-TSO-NEXT: ret 21870 %1 = atomicrmw or ptr %a, i32 %b release 21871 ret i32 %1 21872} 21873 21874define i32 @atomicrmw_or_i32_acq_rel(ptr %a, i32 %b) nounwind { 21875; RV32I-LABEL: atomicrmw_or_i32_acq_rel: 21876; RV32I: # %bb.0: 21877; RV32I-NEXT: addi sp, sp, -16 21878; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21879; RV32I-NEXT: li a2, 4 21880; RV32I-NEXT: call __atomic_fetch_or_4 21881; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21882; RV32I-NEXT: addi sp, sp, 16 21883; RV32I-NEXT: ret 21884; 21885; RV32IA-WMO-LABEL: atomicrmw_or_i32_acq_rel: 21886; RV32IA-WMO: # %bb.0: 21887; RV32IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0) 21888; RV32IA-WMO-NEXT: ret 21889; 21890; RV32IA-TSO-LABEL: atomicrmw_or_i32_acq_rel: 21891; RV32IA-TSO: # %bb.0: 21892; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0) 21893; RV32IA-TSO-NEXT: ret 21894; 21895; RV64I-LABEL: atomicrmw_or_i32_acq_rel: 21896; RV64I: # %bb.0: 21897; RV64I-NEXT: addi sp, sp, -16 21898; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21899; RV64I-NEXT: li a2, 4 21900; RV64I-NEXT: call __atomic_fetch_or_4 21901; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21902; RV64I-NEXT: addi sp, sp, 16 21903; RV64I-NEXT: ret 21904; 21905; RV64IA-WMO-LABEL: atomicrmw_or_i32_acq_rel: 21906; RV64IA-WMO: # %bb.0: 21907; RV64IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0) 21908; RV64IA-WMO-NEXT: ret 21909; 21910; RV64IA-TSO-LABEL: atomicrmw_or_i32_acq_rel: 21911; RV64IA-TSO: # %bb.0: 21912; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0) 21913; RV64IA-TSO-NEXT: ret 21914 %1 = atomicrmw or ptr %a, i32 %b acq_rel 21915 ret i32 %1 21916} 21917 21918define i32 @atomicrmw_or_i32_seq_cst(ptr %a, i32 %b) nounwind { 21919; RV32I-LABEL: atomicrmw_or_i32_seq_cst: 21920; RV32I: # %bb.0: 21921; RV32I-NEXT: addi sp, sp, -16 21922; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21923; RV32I-NEXT: li a2, 5 21924; RV32I-NEXT: call __atomic_fetch_or_4 21925; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21926; RV32I-NEXT: addi sp, sp, 16 21927; RV32I-NEXT: ret 21928; 21929; RV32IA-WMO-LABEL: atomicrmw_or_i32_seq_cst: 21930; RV32IA-WMO: # %bb.0: 21931; RV32IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0) 21932; RV32IA-WMO-NEXT: ret 21933; 21934; RV32IA-TSO-LABEL: atomicrmw_or_i32_seq_cst: 21935; RV32IA-TSO: # %bb.0: 21936; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0) 21937; RV32IA-TSO-NEXT: ret 21938; 21939; RV64I-LABEL: atomicrmw_or_i32_seq_cst: 21940; RV64I: # %bb.0: 21941; RV64I-NEXT: addi sp, sp, -16 21942; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21943; RV64I-NEXT: li a2, 5 21944; RV64I-NEXT: call __atomic_fetch_or_4 21945; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21946; RV64I-NEXT: addi sp, sp, 16 21947; RV64I-NEXT: ret 21948; 21949; RV64IA-WMO-LABEL: atomicrmw_or_i32_seq_cst: 21950; RV64IA-WMO: # %bb.0: 21951; RV64IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0) 21952; RV64IA-WMO-NEXT: ret 21953; 21954; RV64IA-TSO-LABEL: atomicrmw_or_i32_seq_cst: 21955; RV64IA-TSO: # %bb.0: 21956; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0) 21957; RV64IA-TSO-NEXT: ret 21958 %1 = atomicrmw or ptr %a, i32 %b seq_cst 21959 ret i32 %1 21960} 21961 21962define i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind { 21963; RV32I-LABEL: atomicrmw_xor_i32_monotonic: 21964; RV32I: # %bb.0: 21965; RV32I-NEXT: addi sp, sp, -16 21966; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 21967; RV32I-NEXT: li a2, 0 21968; RV32I-NEXT: call __atomic_fetch_xor_4 21969; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21970; RV32I-NEXT: addi sp, sp, 16 21971; RV32I-NEXT: ret 21972; 21973; RV32IA-LABEL: atomicrmw_xor_i32_monotonic: 21974; RV32IA: # %bb.0: 21975; RV32IA-NEXT: amoxor.w a0, a1, (a0) 21976; RV32IA-NEXT: ret 21977; 21978; RV64I-LABEL: atomicrmw_xor_i32_monotonic: 21979; RV64I: # %bb.0: 21980; RV64I-NEXT: addi sp, sp, -16 21981; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 21982; RV64I-NEXT: li a2, 0 21983; RV64I-NEXT: call __atomic_fetch_xor_4 21984; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21985; RV64I-NEXT: addi sp, sp, 16 21986; RV64I-NEXT: ret 21987; 21988; RV64IA-LABEL: atomicrmw_xor_i32_monotonic: 21989; RV64IA: # %bb.0: 21990; RV64IA-NEXT: amoxor.w a0, a1, (a0) 21991; RV64IA-NEXT: ret 21992 %1 = atomicrmw xor ptr %a, i32 %b monotonic 21993 ret i32 %1 21994} 21995 21996define i32 @atomicrmw_xor_i32_acquire(ptr %a, i32 %b) nounwind { 21997; RV32I-LABEL: atomicrmw_xor_i32_acquire: 21998; RV32I: # %bb.0: 21999; RV32I-NEXT: addi sp, sp, -16 22000; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22001; RV32I-NEXT: li a2, 2 22002; RV32I-NEXT: call __atomic_fetch_xor_4 22003; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22004; RV32I-NEXT: addi sp, sp, 16 22005; RV32I-NEXT: ret 22006; 22007; RV32IA-WMO-LABEL: atomicrmw_xor_i32_acquire: 22008; RV32IA-WMO: # %bb.0: 22009; RV32IA-WMO-NEXT: amoxor.w.aq a0, a1, (a0) 22010; RV32IA-WMO-NEXT: ret 22011; 22012; RV32IA-TSO-LABEL: atomicrmw_xor_i32_acquire: 22013; RV32IA-TSO: # %bb.0: 22014; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22015; RV32IA-TSO-NEXT: ret 22016; 22017; RV64I-LABEL: atomicrmw_xor_i32_acquire: 22018; RV64I: # %bb.0: 22019; RV64I-NEXT: addi sp, sp, -16 22020; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 22021; RV64I-NEXT: li a2, 2 22022; RV64I-NEXT: call __atomic_fetch_xor_4 22023; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 22024; RV64I-NEXT: addi sp, sp, 16 22025; RV64I-NEXT: ret 22026; 22027; RV64IA-WMO-LABEL: atomicrmw_xor_i32_acquire: 22028; RV64IA-WMO: # %bb.0: 22029; RV64IA-WMO-NEXT: amoxor.w.aq a0, a1, (a0) 22030; RV64IA-WMO-NEXT: ret 22031; 22032; RV64IA-TSO-LABEL: atomicrmw_xor_i32_acquire: 22033; RV64IA-TSO: # %bb.0: 22034; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22035; RV64IA-TSO-NEXT: ret 22036 %1 = atomicrmw xor ptr %a, i32 %b acquire 22037 ret i32 %1 22038} 22039 22040define i32 @atomicrmw_xor_i32_release(ptr %a, i32 %b) nounwind { 22041; RV32I-LABEL: atomicrmw_xor_i32_release: 22042; RV32I: # %bb.0: 22043; RV32I-NEXT: addi sp, sp, -16 22044; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22045; RV32I-NEXT: li a2, 3 22046; RV32I-NEXT: call __atomic_fetch_xor_4 22047; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22048; RV32I-NEXT: addi sp, sp, 16 22049; RV32I-NEXT: ret 22050; 22051; RV32IA-WMO-LABEL: atomicrmw_xor_i32_release: 22052; RV32IA-WMO: # %bb.0: 22053; RV32IA-WMO-NEXT: amoxor.w.rl a0, a1, (a0) 22054; RV32IA-WMO-NEXT: ret 22055; 22056; RV32IA-TSO-LABEL: atomicrmw_xor_i32_release: 22057; RV32IA-TSO: # %bb.0: 22058; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22059; RV32IA-TSO-NEXT: ret 22060; 22061; RV64I-LABEL: atomicrmw_xor_i32_release: 22062; RV64I: # %bb.0: 22063; RV64I-NEXT: addi sp, sp, -16 22064; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 22065; RV64I-NEXT: li a2, 3 22066; RV64I-NEXT: call __atomic_fetch_xor_4 22067; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 22068; RV64I-NEXT: addi sp, sp, 16 22069; RV64I-NEXT: ret 22070; 22071; RV64IA-WMO-LABEL: atomicrmw_xor_i32_release: 22072; RV64IA-WMO: # %bb.0: 22073; RV64IA-WMO-NEXT: amoxor.w.rl a0, a1, (a0) 22074; RV64IA-WMO-NEXT: ret 22075; 22076; RV64IA-TSO-LABEL: atomicrmw_xor_i32_release: 22077; RV64IA-TSO: # %bb.0: 22078; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22079; RV64IA-TSO-NEXT: ret 22080 %1 = atomicrmw xor ptr %a, i32 %b release 22081 ret i32 %1 22082} 22083 22084define i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind { 22085; RV32I-LABEL: atomicrmw_xor_i32_acq_rel: 22086; RV32I: # %bb.0: 22087; RV32I-NEXT: addi sp, sp, -16 22088; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22089; RV32I-NEXT: li a2, 4 22090; RV32I-NEXT: call __atomic_fetch_xor_4 22091; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22092; RV32I-NEXT: addi sp, sp, 16 22093; RV32I-NEXT: ret 22094; 22095; RV32IA-WMO-LABEL: atomicrmw_xor_i32_acq_rel: 22096; RV32IA-WMO: # %bb.0: 22097; RV32IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0) 22098; RV32IA-WMO-NEXT: ret 22099; 22100; RV32IA-TSO-LABEL: atomicrmw_xor_i32_acq_rel: 22101; RV32IA-TSO: # %bb.0: 22102; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22103; RV32IA-TSO-NEXT: ret 22104; 22105; RV64I-LABEL: atomicrmw_xor_i32_acq_rel: 22106; RV64I: # %bb.0: 22107; RV64I-NEXT: addi sp, sp, -16 22108; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 22109; RV64I-NEXT: li a2, 4 22110; RV64I-NEXT: call __atomic_fetch_xor_4 22111; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 22112; RV64I-NEXT: addi sp, sp, 16 22113; RV64I-NEXT: ret 22114; 22115; RV64IA-WMO-LABEL: atomicrmw_xor_i32_acq_rel: 22116; RV64IA-WMO: # %bb.0: 22117; RV64IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0) 22118; RV64IA-WMO-NEXT: ret 22119; 22120; RV64IA-TSO-LABEL: atomicrmw_xor_i32_acq_rel: 22121; RV64IA-TSO: # %bb.0: 22122; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22123; RV64IA-TSO-NEXT: ret 22124 %1 = atomicrmw xor ptr %a, i32 %b acq_rel 22125 ret i32 %1 22126} 22127 22128define i32 @atomicrmw_xor_i32_seq_cst(ptr %a, i32 %b) nounwind { 22129; RV32I-LABEL: atomicrmw_xor_i32_seq_cst: 22130; RV32I: # %bb.0: 22131; RV32I-NEXT: addi sp, sp, -16 22132; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22133; RV32I-NEXT: li a2, 5 22134; RV32I-NEXT: call __atomic_fetch_xor_4 22135; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22136; RV32I-NEXT: addi sp, sp, 16 22137; RV32I-NEXT: ret 22138; 22139; RV32IA-WMO-LABEL: atomicrmw_xor_i32_seq_cst: 22140; RV32IA-WMO: # %bb.0: 22141; RV32IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0) 22142; RV32IA-WMO-NEXT: ret 22143; 22144; RV32IA-TSO-LABEL: atomicrmw_xor_i32_seq_cst: 22145; RV32IA-TSO: # %bb.0: 22146; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22147; RV32IA-TSO-NEXT: ret 22148; 22149; RV64I-LABEL: atomicrmw_xor_i32_seq_cst: 22150; RV64I: # %bb.0: 22151; RV64I-NEXT: addi sp, sp, -16 22152; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 22153; RV64I-NEXT: li a2, 5 22154; RV64I-NEXT: call __atomic_fetch_xor_4 22155; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 22156; RV64I-NEXT: addi sp, sp, 16 22157; RV64I-NEXT: ret 22158; 22159; RV64IA-WMO-LABEL: atomicrmw_xor_i32_seq_cst: 22160; RV64IA-WMO: # %bb.0: 22161; RV64IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0) 22162; RV64IA-WMO-NEXT: ret 22163; 22164; RV64IA-TSO-LABEL: atomicrmw_xor_i32_seq_cst: 22165; RV64IA-TSO: # %bb.0: 22166; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0) 22167; RV64IA-TSO-NEXT: ret 22168 %1 = atomicrmw xor ptr %a, i32 %b seq_cst 22169 ret i32 %1 22170} 22171 22172define i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind { 22173; RV32I-LABEL: atomicrmw_max_i32_monotonic: 22174; RV32I: # %bb.0: 22175; RV32I-NEXT: addi sp, sp, -16 22176; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22177; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22178; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22179; RV32I-NEXT: mv s0, a0 22180; RV32I-NEXT: lw a3, 0(a0) 22181; RV32I-NEXT: mv s1, a1 22182; RV32I-NEXT: j .LBB165_2 22183; RV32I-NEXT: .LBB165_1: # %atomicrmw.start 22184; RV32I-NEXT: # in Loop: Header=BB165_2 Depth=1 22185; RV32I-NEXT: sw a3, 0(sp) 22186; RV32I-NEXT: mv a1, sp 22187; RV32I-NEXT: mv a0, s0 22188; RV32I-NEXT: li a3, 0 22189; RV32I-NEXT: li a4, 0 22190; RV32I-NEXT: call __atomic_compare_exchange_4 22191; RV32I-NEXT: lw a3, 0(sp) 22192; RV32I-NEXT: bnez a0, .LBB165_4 22193; RV32I-NEXT: .LBB165_2: # %atomicrmw.start 22194; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22195; RV32I-NEXT: mv a2, a3 22196; RV32I-NEXT: blt s1, a3, .LBB165_1 22197; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22198; RV32I-NEXT: # in Loop: Header=BB165_2 Depth=1 22199; RV32I-NEXT: mv a2, s1 22200; RV32I-NEXT: j .LBB165_1 22201; RV32I-NEXT: .LBB165_4: # %atomicrmw.end 22202; RV32I-NEXT: mv a0, a3 22203; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22204; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22205; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22206; RV32I-NEXT: addi sp, sp, 16 22207; RV32I-NEXT: ret 22208; 22209; RV32IA-LABEL: atomicrmw_max_i32_monotonic: 22210; RV32IA: # %bb.0: 22211; RV32IA-NEXT: amomax.w a0, a1, (a0) 22212; RV32IA-NEXT: ret 22213; 22214; RV64I-LABEL: atomicrmw_max_i32_monotonic: 22215; RV64I: # %bb.0: 22216; RV64I-NEXT: addi sp, sp, -48 22217; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22218; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22219; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22220; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22221; RV64I-NEXT: mv s0, a0 22222; RV64I-NEXT: lw a3, 0(a0) 22223; RV64I-NEXT: mv s1, a1 22224; RV64I-NEXT: sext.w s2, a1 22225; RV64I-NEXT: j .LBB165_2 22226; RV64I-NEXT: .LBB165_1: # %atomicrmw.start 22227; RV64I-NEXT: # in Loop: Header=BB165_2 Depth=1 22228; RV64I-NEXT: sw a3, 12(sp) 22229; RV64I-NEXT: addi a1, sp, 12 22230; RV64I-NEXT: mv a0, s0 22231; RV64I-NEXT: li a3, 0 22232; RV64I-NEXT: li a4, 0 22233; RV64I-NEXT: call __atomic_compare_exchange_4 22234; RV64I-NEXT: lw a3, 12(sp) 22235; RV64I-NEXT: bnez a0, .LBB165_4 22236; RV64I-NEXT: .LBB165_2: # %atomicrmw.start 22237; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22238; RV64I-NEXT: mv a2, a3 22239; RV64I-NEXT: blt s2, a3, .LBB165_1 22240; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22241; RV64I-NEXT: # in Loop: Header=BB165_2 Depth=1 22242; RV64I-NEXT: mv a2, s1 22243; RV64I-NEXT: j .LBB165_1 22244; RV64I-NEXT: .LBB165_4: # %atomicrmw.end 22245; RV64I-NEXT: mv a0, a3 22246; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22247; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22248; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22249; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22250; RV64I-NEXT: addi sp, sp, 48 22251; RV64I-NEXT: ret 22252; 22253; RV64IA-LABEL: atomicrmw_max_i32_monotonic: 22254; RV64IA: # %bb.0: 22255; RV64IA-NEXT: amomax.w a0, a1, (a0) 22256; RV64IA-NEXT: ret 22257 %1 = atomicrmw max ptr %a, i32 %b monotonic 22258 ret i32 %1 22259} 22260 22261define i32 @atomicrmw_max_i32_acquire(ptr %a, i32 %b) nounwind { 22262; RV32I-LABEL: atomicrmw_max_i32_acquire: 22263; RV32I: # %bb.0: 22264; RV32I-NEXT: addi sp, sp, -16 22265; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22266; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22267; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22268; RV32I-NEXT: mv s0, a0 22269; RV32I-NEXT: lw a3, 0(a0) 22270; RV32I-NEXT: mv s1, a1 22271; RV32I-NEXT: j .LBB166_2 22272; RV32I-NEXT: .LBB166_1: # %atomicrmw.start 22273; RV32I-NEXT: # in Loop: Header=BB166_2 Depth=1 22274; RV32I-NEXT: sw a3, 0(sp) 22275; RV32I-NEXT: mv a1, sp 22276; RV32I-NEXT: li a3, 2 22277; RV32I-NEXT: li a4, 2 22278; RV32I-NEXT: mv a0, s0 22279; RV32I-NEXT: call __atomic_compare_exchange_4 22280; RV32I-NEXT: lw a3, 0(sp) 22281; RV32I-NEXT: bnez a0, .LBB166_4 22282; RV32I-NEXT: .LBB166_2: # %atomicrmw.start 22283; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22284; RV32I-NEXT: mv a2, a3 22285; RV32I-NEXT: blt s1, a3, .LBB166_1 22286; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22287; RV32I-NEXT: # in Loop: Header=BB166_2 Depth=1 22288; RV32I-NEXT: mv a2, s1 22289; RV32I-NEXT: j .LBB166_1 22290; RV32I-NEXT: .LBB166_4: # %atomicrmw.end 22291; RV32I-NEXT: mv a0, a3 22292; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22293; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22294; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22295; RV32I-NEXT: addi sp, sp, 16 22296; RV32I-NEXT: ret 22297; 22298; RV32IA-WMO-LABEL: atomicrmw_max_i32_acquire: 22299; RV32IA-WMO: # %bb.0: 22300; RV32IA-WMO-NEXT: amomax.w.aq a0, a1, (a0) 22301; RV32IA-WMO-NEXT: ret 22302; 22303; RV32IA-TSO-LABEL: atomicrmw_max_i32_acquire: 22304; RV32IA-TSO: # %bb.0: 22305; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0) 22306; RV32IA-TSO-NEXT: ret 22307; 22308; RV64I-LABEL: atomicrmw_max_i32_acquire: 22309; RV64I: # %bb.0: 22310; RV64I-NEXT: addi sp, sp, -48 22311; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22312; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22313; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22314; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22315; RV64I-NEXT: mv s0, a0 22316; RV64I-NEXT: lw a3, 0(a0) 22317; RV64I-NEXT: mv s1, a1 22318; RV64I-NEXT: sext.w s2, a1 22319; RV64I-NEXT: j .LBB166_2 22320; RV64I-NEXT: .LBB166_1: # %atomicrmw.start 22321; RV64I-NEXT: # in Loop: Header=BB166_2 Depth=1 22322; RV64I-NEXT: sw a3, 12(sp) 22323; RV64I-NEXT: addi a1, sp, 12 22324; RV64I-NEXT: li a3, 2 22325; RV64I-NEXT: li a4, 2 22326; RV64I-NEXT: mv a0, s0 22327; RV64I-NEXT: call __atomic_compare_exchange_4 22328; RV64I-NEXT: lw a3, 12(sp) 22329; RV64I-NEXT: bnez a0, .LBB166_4 22330; RV64I-NEXT: .LBB166_2: # %atomicrmw.start 22331; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22332; RV64I-NEXT: mv a2, a3 22333; RV64I-NEXT: blt s2, a3, .LBB166_1 22334; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22335; RV64I-NEXT: # in Loop: Header=BB166_2 Depth=1 22336; RV64I-NEXT: mv a2, s1 22337; RV64I-NEXT: j .LBB166_1 22338; RV64I-NEXT: .LBB166_4: # %atomicrmw.end 22339; RV64I-NEXT: mv a0, a3 22340; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22341; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22342; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22343; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22344; RV64I-NEXT: addi sp, sp, 48 22345; RV64I-NEXT: ret 22346; 22347; RV64IA-WMO-LABEL: atomicrmw_max_i32_acquire: 22348; RV64IA-WMO: # %bb.0: 22349; RV64IA-WMO-NEXT: amomax.w.aq a0, a1, (a0) 22350; RV64IA-WMO-NEXT: ret 22351; 22352; RV64IA-TSO-LABEL: atomicrmw_max_i32_acquire: 22353; RV64IA-TSO: # %bb.0: 22354; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0) 22355; RV64IA-TSO-NEXT: ret 22356 %1 = atomicrmw max ptr %a, i32 %b acquire 22357 ret i32 %1 22358} 22359 22360define i32 @atomicrmw_max_i32_release(ptr %a, i32 %b) nounwind { 22361; RV32I-LABEL: atomicrmw_max_i32_release: 22362; RV32I: # %bb.0: 22363; RV32I-NEXT: addi sp, sp, -16 22364; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22365; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22366; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22367; RV32I-NEXT: mv s0, a0 22368; RV32I-NEXT: lw a3, 0(a0) 22369; RV32I-NEXT: mv s1, a1 22370; RV32I-NEXT: j .LBB167_2 22371; RV32I-NEXT: .LBB167_1: # %atomicrmw.start 22372; RV32I-NEXT: # in Loop: Header=BB167_2 Depth=1 22373; RV32I-NEXT: sw a3, 0(sp) 22374; RV32I-NEXT: mv a1, sp 22375; RV32I-NEXT: li a3, 3 22376; RV32I-NEXT: mv a0, s0 22377; RV32I-NEXT: li a4, 0 22378; RV32I-NEXT: call __atomic_compare_exchange_4 22379; RV32I-NEXT: lw a3, 0(sp) 22380; RV32I-NEXT: bnez a0, .LBB167_4 22381; RV32I-NEXT: .LBB167_2: # %atomicrmw.start 22382; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22383; RV32I-NEXT: mv a2, a3 22384; RV32I-NEXT: blt s1, a3, .LBB167_1 22385; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22386; RV32I-NEXT: # in Loop: Header=BB167_2 Depth=1 22387; RV32I-NEXT: mv a2, s1 22388; RV32I-NEXT: j .LBB167_1 22389; RV32I-NEXT: .LBB167_4: # %atomicrmw.end 22390; RV32I-NEXT: mv a0, a3 22391; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22392; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22393; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22394; RV32I-NEXT: addi sp, sp, 16 22395; RV32I-NEXT: ret 22396; 22397; RV32IA-WMO-LABEL: atomicrmw_max_i32_release: 22398; RV32IA-WMO: # %bb.0: 22399; RV32IA-WMO-NEXT: amomax.w.rl a0, a1, (a0) 22400; RV32IA-WMO-NEXT: ret 22401; 22402; RV32IA-TSO-LABEL: atomicrmw_max_i32_release: 22403; RV32IA-TSO: # %bb.0: 22404; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0) 22405; RV32IA-TSO-NEXT: ret 22406; 22407; RV64I-LABEL: atomicrmw_max_i32_release: 22408; RV64I: # %bb.0: 22409; RV64I-NEXT: addi sp, sp, -48 22410; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22411; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22412; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22413; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22414; RV64I-NEXT: mv s0, a0 22415; RV64I-NEXT: lw a3, 0(a0) 22416; RV64I-NEXT: mv s1, a1 22417; RV64I-NEXT: sext.w s2, a1 22418; RV64I-NEXT: j .LBB167_2 22419; RV64I-NEXT: .LBB167_1: # %atomicrmw.start 22420; RV64I-NEXT: # in Loop: Header=BB167_2 Depth=1 22421; RV64I-NEXT: sw a3, 12(sp) 22422; RV64I-NEXT: addi a1, sp, 12 22423; RV64I-NEXT: li a3, 3 22424; RV64I-NEXT: mv a0, s0 22425; RV64I-NEXT: li a4, 0 22426; RV64I-NEXT: call __atomic_compare_exchange_4 22427; RV64I-NEXT: lw a3, 12(sp) 22428; RV64I-NEXT: bnez a0, .LBB167_4 22429; RV64I-NEXT: .LBB167_2: # %atomicrmw.start 22430; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22431; RV64I-NEXT: mv a2, a3 22432; RV64I-NEXT: blt s2, a3, .LBB167_1 22433; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22434; RV64I-NEXT: # in Loop: Header=BB167_2 Depth=1 22435; RV64I-NEXT: mv a2, s1 22436; RV64I-NEXT: j .LBB167_1 22437; RV64I-NEXT: .LBB167_4: # %atomicrmw.end 22438; RV64I-NEXT: mv a0, a3 22439; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22440; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22441; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22442; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22443; RV64I-NEXT: addi sp, sp, 48 22444; RV64I-NEXT: ret 22445; 22446; RV64IA-WMO-LABEL: atomicrmw_max_i32_release: 22447; RV64IA-WMO: # %bb.0: 22448; RV64IA-WMO-NEXT: amomax.w.rl a0, a1, (a0) 22449; RV64IA-WMO-NEXT: ret 22450; 22451; RV64IA-TSO-LABEL: atomicrmw_max_i32_release: 22452; RV64IA-TSO: # %bb.0: 22453; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0) 22454; RV64IA-TSO-NEXT: ret 22455 %1 = atomicrmw max ptr %a, i32 %b release 22456 ret i32 %1 22457} 22458 22459define i32 @atomicrmw_max_i32_acq_rel(ptr %a, i32 %b) nounwind { 22460; RV32I-LABEL: atomicrmw_max_i32_acq_rel: 22461; RV32I: # %bb.0: 22462; RV32I-NEXT: addi sp, sp, -16 22463; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22464; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22465; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22466; RV32I-NEXT: mv s0, a0 22467; RV32I-NEXT: lw a3, 0(a0) 22468; RV32I-NEXT: mv s1, a1 22469; RV32I-NEXT: j .LBB168_2 22470; RV32I-NEXT: .LBB168_1: # %atomicrmw.start 22471; RV32I-NEXT: # in Loop: Header=BB168_2 Depth=1 22472; RV32I-NEXT: sw a3, 0(sp) 22473; RV32I-NEXT: mv a1, sp 22474; RV32I-NEXT: li a3, 4 22475; RV32I-NEXT: li a4, 2 22476; RV32I-NEXT: mv a0, s0 22477; RV32I-NEXT: call __atomic_compare_exchange_4 22478; RV32I-NEXT: lw a3, 0(sp) 22479; RV32I-NEXT: bnez a0, .LBB168_4 22480; RV32I-NEXT: .LBB168_2: # %atomicrmw.start 22481; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22482; RV32I-NEXT: mv a2, a3 22483; RV32I-NEXT: blt s1, a3, .LBB168_1 22484; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22485; RV32I-NEXT: # in Loop: Header=BB168_2 Depth=1 22486; RV32I-NEXT: mv a2, s1 22487; RV32I-NEXT: j .LBB168_1 22488; RV32I-NEXT: .LBB168_4: # %atomicrmw.end 22489; RV32I-NEXT: mv a0, a3 22490; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22491; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22492; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22493; RV32I-NEXT: addi sp, sp, 16 22494; RV32I-NEXT: ret 22495; 22496; RV32IA-WMO-LABEL: atomicrmw_max_i32_acq_rel: 22497; RV32IA-WMO: # %bb.0: 22498; RV32IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0) 22499; RV32IA-WMO-NEXT: ret 22500; 22501; RV32IA-TSO-LABEL: atomicrmw_max_i32_acq_rel: 22502; RV32IA-TSO: # %bb.0: 22503; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0) 22504; RV32IA-TSO-NEXT: ret 22505; 22506; RV64I-LABEL: atomicrmw_max_i32_acq_rel: 22507; RV64I: # %bb.0: 22508; RV64I-NEXT: addi sp, sp, -48 22509; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22510; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22511; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22512; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22513; RV64I-NEXT: mv s0, a0 22514; RV64I-NEXT: lw a3, 0(a0) 22515; RV64I-NEXT: mv s1, a1 22516; RV64I-NEXT: sext.w s2, a1 22517; RV64I-NEXT: j .LBB168_2 22518; RV64I-NEXT: .LBB168_1: # %atomicrmw.start 22519; RV64I-NEXT: # in Loop: Header=BB168_2 Depth=1 22520; RV64I-NEXT: sw a3, 12(sp) 22521; RV64I-NEXT: addi a1, sp, 12 22522; RV64I-NEXT: li a3, 4 22523; RV64I-NEXT: li a4, 2 22524; RV64I-NEXT: mv a0, s0 22525; RV64I-NEXT: call __atomic_compare_exchange_4 22526; RV64I-NEXT: lw a3, 12(sp) 22527; RV64I-NEXT: bnez a0, .LBB168_4 22528; RV64I-NEXT: .LBB168_2: # %atomicrmw.start 22529; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22530; RV64I-NEXT: mv a2, a3 22531; RV64I-NEXT: blt s2, a3, .LBB168_1 22532; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22533; RV64I-NEXT: # in Loop: Header=BB168_2 Depth=1 22534; RV64I-NEXT: mv a2, s1 22535; RV64I-NEXT: j .LBB168_1 22536; RV64I-NEXT: .LBB168_4: # %atomicrmw.end 22537; RV64I-NEXT: mv a0, a3 22538; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22539; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22540; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22541; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22542; RV64I-NEXT: addi sp, sp, 48 22543; RV64I-NEXT: ret 22544; 22545; RV64IA-WMO-LABEL: atomicrmw_max_i32_acq_rel: 22546; RV64IA-WMO: # %bb.0: 22547; RV64IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0) 22548; RV64IA-WMO-NEXT: ret 22549; 22550; RV64IA-TSO-LABEL: atomicrmw_max_i32_acq_rel: 22551; RV64IA-TSO: # %bb.0: 22552; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0) 22553; RV64IA-TSO-NEXT: ret 22554 %1 = atomicrmw max ptr %a, i32 %b acq_rel 22555 ret i32 %1 22556} 22557 22558define i32 @atomicrmw_max_i32_seq_cst(ptr %a, i32 %b) nounwind { 22559; RV32I-LABEL: atomicrmw_max_i32_seq_cst: 22560; RV32I: # %bb.0: 22561; RV32I-NEXT: addi sp, sp, -16 22562; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22563; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22564; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22565; RV32I-NEXT: mv s0, a0 22566; RV32I-NEXT: lw a3, 0(a0) 22567; RV32I-NEXT: mv s1, a1 22568; RV32I-NEXT: j .LBB169_2 22569; RV32I-NEXT: .LBB169_1: # %atomicrmw.start 22570; RV32I-NEXT: # in Loop: Header=BB169_2 Depth=1 22571; RV32I-NEXT: sw a3, 0(sp) 22572; RV32I-NEXT: mv a1, sp 22573; RV32I-NEXT: li a3, 5 22574; RV32I-NEXT: li a4, 5 22575; RV32I-NEXT: mv a0, s0 22576; RV32I-NEXT: call __atomic_compare_exchange_4 22577; RV32I-NEXT: lw a3, 0(sp) 22578; RV32I-NEXT: bnez a0, .LBB169_4 22579; RV32I-NEXT: .LBB169_2: # %atomicrmw.start 22580; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22581; RV32I-NEXT: mv a2, a3 22582; RV32I-NEXT: blt s1, a3, .LBB169_1 22583; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22584; RV32I-NEXT: # in Loop: Header=BB169_2 Depth=1 22585; RV32I-NEXT: mv a2, s1 22586; RV32I-NEXT: j .LBB169_1 22587; RV32I-NEXT: .LBB169_4: # %atomicrmw.end 22588; RV32I-NEXT: mv a0, a3 22589; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22590; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22591; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22592; RV32I-NEXT: addi sp, sp, 16 22593; RV32I-NEXT: ret 22594; 22595; RV32IA-WMO-LABEL: atomicrmw_max_i32_seq_cst: 22596; RV32IA-WMO: # %bb.0: 22597; RV32IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0) 22598; RV32IA-WMO-NEXT: ret 22599; 22600; RV32IA-TSO-LABEL: atomicrmw_max_i32_seq_cst: 22601; RV32IA-TSO: # %bb.0: 22602; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0) 22603; RV32IA-TSO-NEXT: ret 22604; 22605; RV64I-LABEL: atomicrmw_max_i32_seq_cst: 22606; RV64I: # %bb.0: 22607; RV64I-NEXT: addi sp, sp, -48 22608; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22609; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22610; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22611; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22612; RV64I-NEXT: mv s0, a0 22613; RV64I-NEXT: lw a3, 0(a0) 22614; RV64I-NEXT: mv s1, a1 22615; RV64I-NEXT: sext.w s2, a1 22616; RV64I-NEXT: j .LBB169_2 22617; RV64I-NEXT: .LBB169_1: # %atomicrmw.start 22618; RV64I-NEXT: # in Loop: Header=BB169_2 Depth=1 22619; RV64I-NEXT: sw a3, 12(sp) 22620; RV64I-NEXT: addi a1, sp, 12 22621; RV64I-NEXT: li a3, 5 22622; RV64I-NEXT: li a4, 5 22623; RV64I-NEXT: mv a0, s0 22624; RV64I-NEXT: call __atomic_compare_exchange_4 22625; RV64I-NEXT: lw a3, 12(sp) 22626; RV64I-NEXT: bnez a0, .LBB169_4 22627; RV64I-NEXT: .LBB169_2: # %atomicrmw.start 22628; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22629; RV64I-NEXT: mv a2, a3 22630; RV64I-NEXT: blt s2, a3, .LBB169_1 22631; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22632; RV64I-NEXT: # in Loop: Header=BB169_2 Depth=1 22633; RV64I-NEXT: mv a2, s1 22634; RV64I-NEXT: j .LBB169_1 22635; RV64I-NEXT: .LBB169_4: # %atomicrmw.end 22636; RV64I-NEXT: mv a0, a3 22637; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22638; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22639; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22640; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22641; RV64I-NEXT: addi sp, sp, 48 22642; RV64I-NEXT: ret 22643; 22644; RV64IA-WMO-LABEL: atomicrmw_max_i32_seq_cst: 22645; RV64IA-WMO: # %bb.0: 22646; RV64IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0) 22647; RV64IA-WMO-NEXT: ret 22648; 22649; RV64IA-TSO-LABEL: atomicrmw_max_i32_seq_cst: 22650; RV64IA-TSO: # %bb.0: 22651; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0) 22652; RV64IA-TSO-NEXT: ret 22653 %1 = atomicrmw max ptr %a, i32 %b seq_cst 22654 ret i32 %1 22655} 22656 22657define i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind { 22658; RV32I-LABEL: atomicrmw_min_i32_monotonic: 22659; RV32I: # %bb.0: 22660; RV32I-NEXT: addi sp, sp, -16 22661; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22662; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22663; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22664; RV32I-NEXT: mv s0, a0 22665; RV32I-NEXT: lw a3, 0(a0) 22666; RV32I-NEXT: mv s1, a1 22667; RV32I-NEXT: j .LBB170_2 22668; RV32I-NEXT: .LBB170_1: # %atomicrmw.start 22669; RV32I-NEXT: # in Loop: Header=BB170_2 Depth=1 22670; RV32I-NEXT: sw a3, 0(sp) 22671; RV32I-NEXT: mv a1, sp 22672; RV32I-NEXT: mv a0, s0 22673; RV32I-NEXT: li a3, 0 22674; RV32I-NEXT: li a4, 0 22675; RV32I-NEXT: call __atomic_compare_exchange_4 22676; RV32I-NEXT: lw a3, 0(sp) 22677; RV32I-NEXT: bnez a0, .LBB170_4 22678; RV32I-NEXT: .LBB170_2: # %atomicrmw.start 22679; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22680; RV32I-NEXT: mv a2, a3 22681; RV32I-NEXT: bge s1, a3, .LBB170_1 22682; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22683; RV32I-NEXT: # in Loop: Header=BB170_2 Depth=1 22684; RV32I-NEXT: mv a2, s1 22685; RV32I-NEXT: j .LBB170_1 22686; RV32I-NEXT: .LBB170_4: # %atomicrmw.end 22687; RV32I-NEXT: mv a0, a3 22688; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22689; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22690; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22691; RV32I-NEXT: addi sp, sp, 16 22692; RV32I-NEXT: ret 22693; 22694; RV32IA-LABEL: atomicrmw_min_i32_monotonic: 22695; RV32IA: # %bb.0: 22696; RV32IA-NEXT: amomin.w a0, a1, (a0) 22697; RV32IA-NEXT: ret 22698; 22699; RV64I-LABEL: atomicrmw_min_i32_monotonic: 22700; RV64I: # %bb.0: 22701; RV64I-NEXT: addi sp, sp, -48 22702; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22703; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22704; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22705; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22706; RV64I-NEXT: mv s0, a0 22707; RV64I-NEXT: lw a3, 0(a0) 22708; RV64I-NEXT: mv s1, a1 22709; RV64I-NEXT: sext.w s2, a1 22710; RV64I-NEXT: j .LBB170_2 22711; RV64I-NEXT: .LBB170_1: # %atomicrmw.start 22712; RV64I-NEXT: # in Loop: Header=BB170_2 Depth=1 22713; RV64I-NEXT: sw a3, 12(sp) 22714; RV64I-NEXT: addi a1, sp, 12 22715; RV64I-NEXT: mv a0, s0 22716; RV64I-NEXT: li a3, 0 22717; RV64I-NEXT: li a4, 0 22718; RV64I-NEXT: call __atomic_compare_exchange_4 22719; RV64I-NEXT: lw a3, 12(sp) 22720; RV64I-NEXT: bnez a0, .LBB170_4 22721; RV64I-NEXT: .LBB170_2: # %atomicrmw.start 22722; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22723; RV64I-NEXT: mv a2, a3 22724; RV64I-NEXT: bge s2, a3, .LBB170_1 22725; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22726; RV64I-NEXT: # in Loop: Header=BB170_2 Depth=1 22727; RV64I-NEXT: mv a2, s1 22728; RV64I-NEXT: j .LBB170_1 22729; RV64I-NEXT: .LBB170_4: # %atomicrmw.end 22730; RV64I-NEXT: mv a0, a3 22731; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22732; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22733; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22734; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22735; RV64I-NEXT: addi sp, sp, 48 22736; RV64I-NEXT: ret 22737; 22738; RV64IA-LABEL: atomicrmw_min_i32_monotonic: 22739; RV64IA: # %bb.0: 22740; RV64IA-NEXT: amomin.w a0, a1, (a0) 22741; RV64IA-NEXT: ret 22742 %1 = atomicrmw min ptr %a, i32 %b monotonic 22743 ret i32 %1 22744} 22745 22746define i32 @atomicrmw_min_i32_acquire(ptr %a, i32 %b) nounwind { 22747; RV32I-LABEL: atomicrmw_min_i32_acquire: 22748; RV32I: # %bb.0: 22749; RV32I-NEXT: addi sp, sp, -16 22750; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22751; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22752; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22753; RV32I-NEXT: mv s0, a0 22754; RV32I-NEXT: lw a3, 0(a0) 22755; RV32I-NEXT: mv s1, a1 22756; RV32I-NEXT: j .LBB171_2 22757; RV32I-NEXT: .LBB171_1: # %atomicrmw.start 22758; RV32I-NEXT: # in Loop: Header=BB171_2 Depth=1 22759; RV32I-NEXT: sw a3, 0(sp) 22760; RV32I-NEXT: mv a1, sp 22761; RV32I-NEXT: li a3, 2 22762; RV32I-NEXT: li a4, 2 22763; RV32I-NEXT: mv a0, s0 22764; RV32I-NEXT: call __atomic_compare_exchange_4 22765; RV32I-NEXT: lw a3, 0(sp) 22766; RV32I-NEXT: bnez a0, .LBB171_4 22767; RV32I-NEXT: .LBB171_2: # %atomicrmw.start 22768; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22769; RV32I-NEXT: mv a2, a3 22770; RV32I-NEXT: bge s1, a3, .LBB171_1 22771; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22772; RV32I-NEXT: # in Loop: Header=BB171_2 Depth=1 22773; RV32I-NEXT: mv a2, s1 22774; RV32I-NEXT: j .LBB171_1 22775; RV32I-NEXT: .LBB171_4: # %atomicrmw.end 22776; RV32I-NEXT: mv a0, a3 22777; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22778; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22779; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22780; RV32I-NEXT: addi sp, sp, 16 22781; RV32I-NEXT: ret 22782; 22783; RV32IA-WMO-LABEL: atomicrmw_min_i32_acquire: 22784; RV32IA-WMO: # %bb.0: 22785; RV32IA-WMO-NEXT: amomin.w.aq a0, a1, (a0) 22786; RV32IA-WMO-NEXT: ret 22787; 22788; RV32IA-TSO-LABEL: atomicrmw_min_i32_acquire: 22789; RV32IA-TSO: # %bb.0: 22790; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0) 22791; RV32IA-TSO-NEXT: ret 22792; 22793; RV64I-LABEL: atomicrmw_min_i32_acquire: 22794; RV64I: # %bb.0: 22795; RV64I-NEXT: addi sp, sp, -48 22796; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22797; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22798; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22799; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22800; RV64I-NEXT: mv s0, a0 22801; RV64I-NEXT: lw a3, 0(a0) 22802; RV64I-NEXT: mv s1, a1 22803; RV64I-NEXT: sext.w s2, a1 22804; RV64I-NEXT: j .LBB171_2 22805; RV64I-NEXT: .LBB171_1: # %atomicrmw.start 22806; RV64I-NEXT: # in Loop: Header=BB171_2 Depth=1 22807; RV64I-NEXT: sw a3, 12(sp) 22808; RV64I-NEXT: addi a1, sp, 12 22809; RV64I-NEXT: li a3, 2 22810; RV64I-NEXT: li a4, 2 22811; RV64I-NEXT: mv a0, s0 22812; RV64I-NEXT: call __atomic_compare_exchange_4 22813; RV64I-NEXT: lw a3, 12(sp) 22814; RV64I-NEXT: bnez a0, .LBB171_4 22815; RV64I-NEXT: .LBB171_2: # %atomicrmw.start 22816; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22817; RV64I-NEXT: mv a2, a3 22818; RV64I-NEXT: bge s2, a3, .LBB171_1 22819; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22820; RV64I-NEXT: # in Loop: Header=BB171_2 Depth=1 22821; RV64I-NEXT: mv a2, s1 22822; RV64I-NEXT: j .LBB171_1 22823; RV64I-NEXT: .LBB171_4: # %atomicrmw.end 22824; RV64I-NEXT: mv a0, a3 22825; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22826; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22827; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22828; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22829; RV64I-NEXT: addi sp, sp, 48 22830; RV64I-NEXT: ret 22831; 22832; RV64IA-WMO-LABEL: atomicrmw_min_i32_acquire: 22833; RV64IA-WMO: # %bb.0: 22834; RV64IA-WMO-NEXT: amomin.w.aq a0, a1, (a0) 22835; RV64IA-WMO-NEXT: ret 22836; 22837; RV64IA-TSO-LABEL: atomicrmw_min_i32_acquire: 22838; RV64IA-TSO: # %bb.0: 22839; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0) 22840; RV64IA-TSO-NEXT: ret 22841 %1 = atomicrmw min ptr %a, i32 %b acquire 22842 ret i32 %1 22843} 22844 22845define i32 @atomicrmw_min_i32_release(ptr %a, i32 %b) nounwind { 22846; RV32I-LABEL: atomicrmw_min_i32_release: 22847; RV32I: # %bb.0: 22848; RV32I-NEXT: addi sp, sp, -16 22849; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22850; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22851; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22852; RV32I-NEXT: mv s0, a0 22853; RV32I-NEXT: lw a3, 0(a0) 22854; RV32I-NEXT: mv s1, a1 22855; RV32I-NEXT: j .LBB172_2 22856; RV32I-NEXT: .LBB172_1: # %atomicrmw.start 22857; RV32I-NEXT: # in Loop: Header=BB172_2 Depth=1 22858; RV32I-NEXT: sw a3, 0(sp) 22859; RV32I-NEXT: mv a1, sp 22860; RV32I-NEXT: li a3, 3 22861; RV32I-NEXT: mv a0, s0 22862; RV32I-NEXT: li a4, 0 22863; RV32I-NEXT: call __atomic_compare_exchange_4 22864; RV32I-NEXT: lw a3, 0(sp) 22865; RV32I-NEXT: bnez a0, .LBB172_4 22866; RV32I-NEXT: .LBB172_2: # %atomicrmw.start 22867; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22868; RV32I-NEXT: mv a2, a3 22869; RV32I-NEXT: bge s1, a3, .LBB172_1 22870; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22871; RV32I-NEXT: # in Loop: Header=BB172_2 Depth=1 22872; RV32I-NEXT: mv a2, s1 22873; RV32I-NEXT: j .LBB172_1 22874; RV32I-NEXT: .LBB172_4: # %atomicrmw.end 22875; RV32I-NEXT: mv a0, a3 22876; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22877; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22878; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22879; RV32I-NEXT: addi sp, sp, 16 22880; RV32I-NEXT: ret 22881; 22882; RV32IA-WMO-LABEL: atomicrmw_min_i32_release: 22883; RV32IA-WMO: # %bb.0: 22884; RV32IA-WMO-NEXT: amomin.w.rl a0, a1, (a0) 22885; RV32IA-WMO-NEXT: ret 22886; 22887; RV32IA-TSO-LABEL: atomicrmw_min_i32_release: 22888; RV32IA-TSO: # %bb.0: 22889; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0) 22890; RV32IA-TSO-NEXT: ret 22891; 22892; RV64I-LABEL: atomicrmw_min_i32_release: 22893; RV64I: # %bb.0: 22894; RV64I-NEXT: addi sp, sp, -48 22895; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22896; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22897; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22898; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22899; RV64I-NEXT: mv s0, a0 22900; RV64I-NEXT: lw a3, 0(a0) 22901; RV64I-NEXT: mv s1, a1 22902; RV64I-NEXT: sext.w s2, a1 22903; RV64I-NEXT: j .LBB172_2 22904; RV64I-NEXT: .LBB172_1: # %atomicrmw.start 22905; RV64I-NEXT: # in Loop: Header=BB172_2 Depth=1 22906; RV64I-NEXT: sw a3, 12(sp) 22907; RV64I-NEXT: addi a1, sp, 12 22908; RV64I-NEXT: li a3, 3 22909; RV64I-NEXT: mv a0, s0 22910; RV64I-NEXT: li a4, 0 22911; RV64I-NEXT: call __atomic_compare_exchange_4 22912; RV64I-NEXT: lw a3, 12(sp) 22913; RV64I-NEXT: bnez a0, .LBB172_4 22914; RV64I-NEXT: .LBB172_2: # %atomicrmw.start 22915; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 22916; RV64I-NEXT: mv a2, a3 22917; RV64I-NEXT: bge s2, a3, .LBB172_1 22918; RV64I-NEXT: # %bb.3: # %atomicrmw.start 22919; RV64I-NEXT: # in Loop: Header=BB172_2 Depth=1 22920; RV64I-NEXT: mv a2, s1 22921; RV64I-NEXT: j .LBB172_1 22922; RV64I-NEXT: .LBB172_4: # %atomicrmw.end 22923; RV64I-NEXT: mv a0, a3 22924; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 22925; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 22926; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 22927; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 22928; RV64I-NEXT: addi sp, sp, 48 22929; RV64I-NEXT: ret 22930; 22931; RV64IA-WMO-LABEL: atomicrmw_min_i32_release: 22932; RV64IA-WMO: # %bb.0: 22933; RV64IA-WMO-NEXT: amomin.w.rl a0, a1, (a0) 22934; RV64IA-WMO-NEXT: ret 22935; 22936; RV64IA-TSO-LABEL: atomicrmw_min_i32_release: 22937; RV64IA-TSO: # %bb.0: 22938; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0) 22939; RV64IA-TSO-NEXT: ret 22940 %1 = atomicrmw min ptr %a, i32 %b release 22941 ret i32 %1 22942} 22943 22944define i32 @atomicrmw_min_i32_acq_rel(ptr %a, i32 %b) nounwind { 22945; RV32I-LABEL: atomicrmw_min_i32_acq_rel: 22946; RV32I: # %bb.0: 22947; RV32I-NEXT: addi sp, sp, -16 22948; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 22949; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 22950; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 22951; RV32I-NEXT: mv s0, a0 22952; RV32I-NEXT: lw a3, 0(a0) 22953; RV32I-NEXT: mv s1, a1 22954; RV32I-NEXT: j .LBB173_2 22955; RV32I-NEXT: .LBB173_1: # %atomicrmw.start 22956; RV32I-NEXT: # in Loop: Header=BB173_2 Depth=1 22957; RV32I-NEXT: sw a3, 0(sp) 22958; RV32I-NEXT: mv a1, sp 22959; RV32I-NEXT: li a3, 4 22960; RV32I-NEXT: li a4, 2 22961; RV32I-NEXT: mv a0, s0 22962; RV32I-NEXT: call __atomic_compare_exchange_4 22963; RV32I-NEXT: lw a3, 0(sp) 22964; RV32I-NEXT: bnez a0, .LBB173_4 22965; RV32I-NEXT: .LBB173_2: # %atomicrmw.start 22966; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 22967; RV32I-NEXT: mv a2, a3 22968; RV32I-NEXT: bge s1, a3, .LBB173_1 22969; RV32I-NEXT: # %bb.3: # %atomicrmw.start 22970; RV32I-NEXT: # in Loop: Header=BB173_2 Depth=1 22971; RV32I-NEXT: mv a2, s1 22972; RV32I-NEXT: j .LBB173_1 22973; RV32I-NEXT: .LBB173_4: # %atomicrmw.end 22974; RV32I-NEXT: mv a0, a3 22975; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 22976; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 22977; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 22978; RV32I-NEXT: addi sp, sp, 16 22979; RV32I-NEXT: ret 22980; 22981; RV32IA-WMO-LABEL: atomicrmw_min_i32_acq_rel: 22982; RV32IA-WMO: # %bb.0: 22983; RV32IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0) 22984; RV32IA-WMO-NEXT: ret 22985; 22986; RV32IA-TSO-LABEL: atomicrmw_min_i32_acq_rel: 22987; RV32IA-TSO: # %bb.0: 22988; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0) 22989; RV32IA-TSO-NEXT: ret 22990; 22991; RV64I-LABEL: atomicrmw_min_i32_acq_rel: 22992; RV64I: # %bb.0: 22993; RV64I-NEXT: addi sp, sp, -48 22994; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 22995; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 22996; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 22997; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 22998; RV64I-NEXT: mv s0, a0 22999; RV64I-NEXT: lw a3, 0(a0) 23000; RV64I-NEXT: mv s1, a1 23001; RV64I-NEXT: sext.w s2, a1 23002; RV64I-NEXT: j .LBB173_2 23003; RV64I-NEXT: .LBB173_1: # %atomicrmw.start 23004; RV64I-NEXT: # in Loop: Header=BB173_2 Depth=1 23005; RV64I-NEXT: sw a3, 12(sp) 23006; RV64I-NEXT: addi a1, sp, 12 23007; RV64I-NEXT: li a3, 4 23008; RV64I-NEXT: li a4, 2 23009; RV64I-NEXT: mv a0, s0 23010; RV64I-NEXT: call __atomic_compare_exchange_4 23011; RV64I-NEXT: lw a3, 12(sp) 23012; RV64I-NEXT: bnez a0, .LBB173_4 23013; RV64I-NEXT: .LBB173_2: # %atomicrmw.start 23014; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23015; RV64I-NEXT: mv a2, a3 23016; RV64I-NEXT: bge s2, a3, .LBB173_1 23017; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23018; RV64I-NEXT: # in Loop: Header=BB173_2 Depth=1 23019; RV64I-NEXT: mv a2, s1 23020; RV64I-NEXT: j .LBB173_1 23021; RV64I-NEXT: .LBB173_4: # %atomicrmw.end 23022; RV64I-NEXT: mv a0, a3 23023; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23024; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23025; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23026; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23027; RV64I-NEXT: addi sp, sp, 48 23028; RV64I-NEXT: ret 23029; 23030; RV64IA-WMO-LABEL: atomicrmw_min_i32_acq_rel: 23031; RV64IA-WMO: # %bb.0: 23032; RV64IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0) 23033; RV64IA-WMO-NEXT: ret 23034; 23035; RV64IA-TSO-LABEL: atomicrmw_min_i32_acq_rel: 23036; RV64IA-TSO: # %bb.0: 23037; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0) 23038; RV64IA-TSO-NEXT: ret 23039 %1 = atomicrmw min ptr %a, i32 %b acq_rel 23040 ret i32 %1 23041} 23042 23043define i32 @atomicrmw_min_i32_seq_cst(ptr %a, i32 %b) nounwind { 23044; RV32I-LABEL: atomicrmw_min_i32_seq_cst: 23045; RV32I: # %bb.0: 23046; RV32I-NEXT: addi sp, sp, -16 23047; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23048; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23049; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23050; RV32I-NEXT: mv s0, a0 23051; RV32I-NEXT: lw a3, 0(a0) 23052; RV32I-NEXT: mv s1, a1 23053; RV32I-NEXT: j .LBB174_2 23054; RV32I-NEXT: .LBB174_1: # %atomicrmw.start 23055; RV32I-NEXT: # in Loop: Header=BB174_2 Depth=1 23056; RV32I-NEXT: sw a3, 0(sp) 23057; RV32I-NEXT: mv a1, sp 23058; RV32I-NEXT: li a3, 5 23059; RV32I-NEXT: li a4, 5 23060; RV32I-NEXT: mv a0, s0 23061; RV32I-NEXT: call __atomic_compare_exchange_4 23062; RV32I-NEXT: lw a3, 0(sp) 23063; RV32I-NEXT: bnez a0, .LBB174_4 23064; RV32I-NEXT: .LBB174_2: # %atomicrmw.start 23065; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23066; RV32I-NEXT: mv a2, a3 23067; RV32I-NEXT: bge s1, a3, .LBB174_1 23068; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23069; RV32I-NEXT: # in Loop: Header=BB174_2 Depth=1 23070; RV32I-NEXT: mv a2, s1 23071; RV32I-NEXT: j .LBB174_1 23072; RV32I-NEXT: .LBB174_4: # %atomicrmw.end 23073; RV32I-NEXT: mv a0, a3 23074; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23075; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23076; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23077; RV32I-NEXT: addi sp, sp, 16 23078; RV32I-NEXT: ret 23079; 23080; RV32IA-WMO-LABEL: atomicrmw_min_i32_seq_cst: 23081; RV32IA-WMO: # %bb.0: 23082; RV32IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0) 23083; RV32IA-WMO-NEXT: ret 23084; 23085; RV32IA-TSO-LABEL: atomicrmw_min_i32_seq_cst: 23086; RV32IA-TSO: # %bb.0: 23087; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0) 23088; RV32IA-TSO-NEXT: ret 23089; 23090; RV64I-LABEL: atomicrmw_min_i32_seq_cst: 23091; RV64I: # %bb.0: 23092; RV64I-NEXT: addi sp, sp, -48 23093; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23094; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23095; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23096; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23097; RV64I-NEXT: mv s0, a0 23098; RV64I-NEXT: lw a3, 0(a0) 23099; RV64I-NEXT: mv s1, a1 23100; RV64I-NEXT: sext.w s2, a1 23101; RV64I-NEXT: j .LBB174_2 23102; RV64I-NEXT: .LBB174_1: # %atomicrmw.start 23103; RV64I-NEXT: # in Loop: Header=BB174_2 Depth=1 23104; RV64I-NEXT: sw a3, 12(sp) 23105; RV64I-NEXT: addi a1, sp, 12 23106; RV64I-NEXT: li a3, 5 23107; RV64I-NEXT: li a4, 5 23108; RV64I-NEXT: mv a0, s0 23109; RV64I-NEXT: call __atomic_compare_exchange_4 23110; RV64I-NEXT: lw a3, 12(sp) 23111; RV64I-NEXT: bnez a0, .LBB174_4 23112; RV64I-NEXT: .LBB174_2: # %atomicrmw.start 23113; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23114; RV64I-NEXT: mv a2, a3 23115; RV64I-NEXT: bge s2, a3, .LBB174_1 23116; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23117; RV64I-NEXT: # in Loop: Header=BB174_2 Depth=1 23118; RV64I-NEXT: mv a2, s1 23119; RV64I-NEXT: j .LBB174_1 23120; RV64I-NEXT: .LBB174_4: # %atomicrmw.end 23121; RV64I-NEXT: mv a0, a3 23122; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23123; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23124; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23125; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23126; RV64I-NEXT: addi sp, sp, 48 23127; RV64I-NEXT: ret 23128; 23129; RV64IA-WMO-LABEL: atomicrmw_min_i32_seq_cst: 23130; RV64IA-WMO: # %bb.0: 23131; RV64IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0) 23132; RV64IA-WMO-NEXT: ret 23133; 23134; RV64IA-TSO-LABEL: atomicrmw_min_i32_seq_cst: 23135; RV64IA-TSO: # %bb.0: 23136; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0) 23137; RV64IA-TSO-NEXT: ret 23138 %1 = atomicrmw min ptr %a, i32 %b seq_cst 23139 ret i32 %1 23140} 23141 23142define i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind { 23143; RV32I-LABEL: atomicrmw_umax_i32_monotonic: 23144; RV32I: # %bb.0: 23145; RV32I-NEXT: addi sp, sp, -16 23146; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23147; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23148; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23149; RV32I-NEXT: mv s0, a0 23150; RV32I-NEXT: lw a3, 0(a0) 23151; RV32I-NEXT: mv s1, a1 23152; RV32I-NEXT: j .LBB175_2 23153; RV32I-NEXT: .LBB175_1: # %atomicrmw.start 23154; RV32I-NEXT: # in Loop: Header=BB175_2 Depth=1 23155; RV32I-NEXT: sw a3, 0(sp) 23156; RV32I-NEXT: mv a1, sp 23157; RV32I-NEXT: mv a0, s0 23158; RV32I-NEXT: li a3, 0 23159; RV32I-NEXT: li a4, 0 23160; RV32I-NEXT: call __atomic_compare_exchange_4 23161; RV32I-NEXT: lw a3, 0(sp) 23162; RV32I-NEXT: bnez a0, .LBB175_4 23163; RV32I-NEXT: .LBB175_2: # %atomicrmw.start 23164; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23165; RV32I-NEXT: mv a2, a3 23166; RV32I-NEXT: bltu s1, a3, .LBB175_1 23167; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23168; RV32I-NEXT: # in Loop: Header=BB175_2 Depth=1 23169; RV32I-NEXT: mv a2, s1 23170; RV32I-NEXT: j .LBB175_1 23171; RV32I-NEXT: .LBB175_4: # %atomicrmw.end 23172; RV32I-NEXT: mv a0, a3 23173; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23174; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23175; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23176; RV32I-NEXT: addi sp, sp, 16 23177; RV32I-NEXT: ret 23178; 23179; RV32IA-LABEL: atomicrmw_umax_i32_monotonic: 23180; RV32IA: # %bb.0: 23181; RV32IA-NEXT: amomaxu.w a0, a1, (a0) 23182; RV32IA-NEXT: ret 23183; 23184; RV64I-LABEL: atomicrmw_umax_i32_monotonic: 23185; RV64I: # %bb.0: 23186; RV64I-NEXT: addi sp, sp, -48 23187; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23188; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23189; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23190; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23191; RV64I-NEXT: mv s0, a0 23192; RV64I-NEXT: lw a3, 0(a0) 23193; RV64I-NEXT: mv s1, a1 23194; RV64I-NEXT: sext.w s2, a1 23195; RV64I-NEXT: j .LBB175_2 23196; RV64I-NEXT: .LBB175_1: # %atomicrmw.start 23197; RV64I-NEXT: # in Loop: Header=BB175_2 Depth=1 23198; RV64I-NEXT: sw a3, 12(sp) 23199; RV64I-NEXT: addi a1, sp, 12 23200; RV64I-NEXT: mv a0, s0 23201; RV64I-NEXT: li a3, 0 23202; RV64I-NEXT: li a4, 0 23203; RV64I-NEXT: call __atomic_compare_exchange_4 23204; RV64I-NEXT: lw a3, 12(sp) 23205; RV64I-NEXT: bnez a0, .LBB175_4 23206; RV64I-NEXT: .LBB175_2: # %atomicrmw.start 23207; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23208; RV64I-NEXT: mv a2, a3 23209; RV64I-NEXT: bltu s2, a3, .LBB175_1 23210; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23211; RV64I-NEXT: # in Loop: Header=BB175_2 Depth=1 23212; RV64I-NEXT: mv a2, s1 23213; RV64I-NEXT: j .LBB175_1 23214; RV64I-NEXT: .LBB175_4: # %atomicrmw.end 23215; RV64I-NEXT: mv a0, a3 23216; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23217; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23218; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23219; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23220; RV64I-NEXT: addi sp, sp, 48 23221; RV64I-NEXT: ret 23222; 23223; RV64IA-LABEL: atomicrmw_umax_i32_monotonic: 23224; RV64IA: # %bb.0: 23225; RV64IA-NEXT: amomaxu.w a0, a1, (a0) 23226; RV64IA-NEXT: ret 23227 %1 = atomicrmw umax ptr %a, i32 %b monotonic 23228 ret i32 %1 23229} 23230 23231define i32 @atomicrmw_umax_i32_acquire(ptr %a, i32 %b) nounwind { 23232; RV32I-LABEL: atomicrmw_umax_i32_acquire: 23233; RV32I: # %bb.0: 23234; RV32I-NEXT: addi sp, sp, -16 23235; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23236; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23237; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23238; RV32I-NEXT: mv s0, a0 23239; RV32I-NEXT: lw a3, 0(a0) 23240; RV32I-NEXT: mv s1, a1 23241; RV32I-NEXT: j .LBB176_2 23242; RV32I-NEXT: .LBB176_1: # %atomicrmw.start 23243; RV32I-NEXT: # in Loop: Header=BB176_2 Depth=1 23244; RV32I-NEXT: sw a3, 0(sp) 23245; RV32I-NEXT: mv a1, sp 23246; RV32I-NEXT: li a3, 2 23247; RV32I-NEXT: li a4, 2 23248; RV32I-NEXT: mv a0, s0 23249; RV32I-NEXT: call __atomic_compare_exchange_4 23250; RV32I-NEXT: lw a3, 0(sp) 23251; RV32I-NEXT: bnez a0, .LBB176_4 23252; RV32I-NEXT: .LBB176_2: # %atomicrmw.start 23253; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23254; RV32I-NEXT: mv a2, a3 23255; RV32I-NEXT: bltu s1, a3, .LBB176_1 23256; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23257; RV32I-NEXT: # in Loop: Header=BB176_2 Depth=1 23258; RV32I-NEXT: mv a2, s1 23259; RV32I-NEXT: j .LBB176_1 23260; RV32I-NEXT: .LBB176_4: # %atomicrmw.end 23261; RV32I-NEXT: mv a0, a3 23262; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23263; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23264; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23265; RV32I-NEXT: addi sp, sp, 16 23266; RV32I-NEXT: ret 23267; 23268; RV32IA-WMO-LABEL: atomicrmw_umax_i32_acquire: 23269; RV32IA-WMO: # %bb.0: 23270; RV32IA-WMO-NEXT: amomaxu.w.aq a0, a1, (a0) 23271; RV32IA-WMO-NEXT: ret 23272; 23273; RV32IA-TSO-LABEL: atomicrmw_umax_i32_acquire: 23274; RV32IA-TSO: # %bb.0: 23275; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23276; RV32IA-TSO-NEXT: ret 23277; 23278; RV64I-LABEL: atomicrmw_umax_i32_acquire: 23279; RV64I: # %bb.0: 23280; RV64I-NEXT: addi sp, sp, -48 23281; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23282; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23283; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23284; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23285; RV64I-NEXT: mv s0, a0 23286; RV64I-NEXT: lw a3, 0(a0) 23287; RV64I-NEXT: mv s1, a1 23288; RV64I-NEXT: sext.w s2, a1 23289; RV64I-NEXT: j .LBB176_2 23290; RV64I-NEXT: .LBB176_1: # %atomicrmw.start 23291; RV64I-NEXT: # in Loop: Header=BB176_2 Depth=1 23292; RV64I-NEXT: sw a3, 12(sp) 23293; RV64I-NEXT: addi a1, sp, 12 23294; RV64I-NEXT: li a3, 2 23295; RV64I-NEXT: li a4, 2 23296; RV64I-NEXT: mv a0, s0 23297; RV64I-NEXT: call __atomic_compare_exchange_4 23298; RV64I-NEXT: lw a3, 12(sp) 23299; RV64I-NEXT: bnez a0, .LBB176_4 23300; RV64I-NEXT: .LBB176_2: # %atomicrmw.start 23301; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23302; RV64I-NEXT: mv a2, a3 23303; RV64I-NEXT: bltu s2, a3, .LBB176_1 23304; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23305; RV64I-NEXT: # in Loop: Header=BB176_2 Depth=1 23306; RV64I-NEXT: mv a2, s1 23307; RV64I-NEXT: j .LBB176_1 23308; RV64I-NEXT: .LBB176_4: # %atomicrmw.end 23309; RV64I-NEXT: mv a0, a3 23310; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23311; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23312; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23313; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23314; RV64I-NEXT: addi sp, sp, 48 23315; RV64I-NEXT: ret 23316; 23317; RV64IA-WMO-LABEL: atomicrmw_umax_i32_acquire: 23318; RV64IA-WMO: # %bb.0: 23319; RV64IA-WMO-NEXT: amomaxu.w.aq a0, a1, (a0) 23320; RV64IA-WMO-NEXT: ret 23321; 23322; RV64IA-TSO-LABEL: atomicrmw_umax_i32_acquire: 23323; RV64IA-TSO: # %bb.0: 23324; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23325; RV64IA-TSO-NEXT: ret 23326 %1 = atomicrmw umax ptr %a, i32 %b acquire 23327 ret i32 %1 23328} 23329 23330define i32 @atomicrmw_umax_i32_release(ptr %a, i32 %b) nounwind { 23331; RV32I-LABEL: atomicrmw_umax_i32_release: 23332; RV32I: # %bb.0: 23333; RV32I-NEXT: addi sp, sp, -16 23334; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23335; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23336; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23337; RV32I-NEXT: mv s0, a0 23338; RV32I-NEXT: lw a3, 0(a0) 23339; RV32I-NEXT: mv s1, a1 23340; RV32I-NEXT: j .LBB177_2 23341; RV32I-NEXT: .LBB177_1: # %atomicrmw.start 23342; RV32I-NEXT: # in Loop: Header=BB177_2 Depth=1 23343; RV32I-NEXT: sw a3, 0(sp) 23344; RV32I-NEXT: mv a1, sp 23345; RV32I-NEXT: li a3, 3 23346; RV32I-NEXT: mv a0, s0 23347; RV32I-NEXT: li a4, 0 23348; RV32I-NEXT: call __atomic_compare_exchange_4 23349; RV32I-NEXT: lw a3, 0(sp) 23350; RV32I-NEXT: bnez a0, .LBB177_4 23351; RV32I-NEXT: .LBB177_2: # %atomicrmw.start 23352; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23353; RV32I-NEXT: mv a2, a3 23354; RV32I-NEXT: bltu s1, a3, .LBB177_1 23355; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23356; RV32I-NEXT: # in Loop: Header=BB177_2 Depth=1 23357; RV32I-NEXT: mv a2, s1 23358; RV32I-NEXT: j .LBB177_1 23359; RV32I-NEXT: .LBB177_4: # %atomicrmw.end 23360; RV32I-NEXT: mv a0, a3 23361; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23362; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23363; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23364; RV32I-NEXT: addi sp, sp, 16 23365; RV32I-NEXT: ret 23366; 23367; RV32IA-WMO-LABEL: atomicrmw_umax_i32_release: 23368; RV32IA-WMO: # %bb.0: 23369; RV32IA-WMO-NEXT: amomaxu.w.rl a0, a1, (a0) 23370; RV32IA-WMO-NEXT: ret 23371; 23372; RV32IA-TSO-LABEL: atomicrmw_umax_i32_release: 23373; RV32IA-TSO: # %bb.0: 23374; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23375; RV32IA-TSO-NEXT: ret 23376; 23377; RV64I-LABEL: atomicrmw_umax_i32_release: 23378; RV64I: # %bb.0: 23379; RV64I-NEXT: addi sp, sp, -48 23380; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23381; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23382; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23383; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23384; RV64I-NEXT: mv s0, a0 23385; RV64I-NEXT: lw a3, 0(a0) 23386; RV64I-NEXT: mv s1, a1 23387; RV64I-NEXT: sext.w s2, a1 23388; RV64I-NEXT: j .LBB177_2 23389; RV64I-NEXT: .LBB177_1: # %atomicrmw.start 23390; RV64I-NEXT: # in Loop: Header=BB177_2 Depth=1 23391; RV64I-NEXT: sw a3, 12(sp) 23392; RV64I-NEXT: addi a1, sp, 12 23393; RV64I-NEXT: li a3, 3 23394; RV64I-NEXT: mv a0, s0 23395; RV64I-NEXT: li a4, 0 23396; RV64I-NEXT: call __atomic_compare_exchange_4 23397; RV64I-NEXT: lw a3, 12(sp) 23398; RV64I-NEXT: bnez a0, .LBB177_4 23399; RV64I-NEXT: .LBB177_2: # %atomicrmw.start 23400; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23401; RV64I-NEXT: mv a2, a3 23402; RV64I-NEXT: bltu s2, a3, .LBB177_1 23403; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23404; RV64I-NEXT: # in Loop: Header=BB177_2 Depth=1 23405; RV64I-NEXT: mv a2, s1 23406; RV64I-NEXT: j .LBB177_1 23407; RV64I-NEXT: .LBB177_4: # %atomicrmw.end 23408; RV64I-NEXT: mv a0, a3 23409; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23410; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23411; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23412; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23413; RV64I-NEXT: addi sp, sp, 48 23414; RV64I-NEXT: ret 23415; 23416; RV64IA-WMO-LABEL: atomicrmw_umax_i32_release: 23417; RV64IA-WMO: # %bb.0: 23418; RV64IA-WMO-NEXT: amomaxu.w.rl a0, a1, (a0) 23419; RV64IA-WMO-NEXT: ret 23420; 23421; RV64IA-TSO-LABEL: atomicrmw_umax_i32_release: 23422; RV64IA-TSO: # %bb.0: 23423; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23424; RV64IA-TSO-NEXT: ret 23425 %1 = atomicrmw umax ptr %a, i32 %b release 23426 ret i32 %1 23427} 23428 23429define i32 @atomicrmw_umax_i32_acq_rel(ptr %a, i32 %b) nounwind { 23430; RV32I-LABEL: atomicrmw_umax_i32_acq_rel: 23431; RV32I: # %bb.0: 23432; RV32I-NEXT: addi sp, sp, -16 23433; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23434; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23435; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23436; RV32I-NEXT: mv s0, a0 23437; RV32I-NEXT: lw a3, 0(a0) 23438; RV32I-NEXT: mv s1, a1 23439; RV32I-NEXT: j .LBB178_2 23440; RV32I-NEXT: .LBB178_1: # %atomicrmw.start 23441; RV32I-NEXT: # in Loop: Header=BB178_2 Depth=1 23442; RV32I-NEXT: sw a3, 0(sp) 23443; RV32I-NEXT: mv a1, sp 23444; RV32I-NEXT: li a3, 4 23445; RV32I-NEXT: li a4, 2 23446; RV32I-NEXT: mv a0, s0 23447; RV32I-NEXT: call __atomic_compare_exchange_4 23448; RV32I-NEXT: lw a3, 0(sp) 23449; RV32I-NEXT: bnez a0, .LBB178_4 23450; RV32I-NEXT: .LBB178_2: # %atomicrmw.start 23451; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23452; RV32I-NEXT: mv a2, a3 23453; RV32I-NEXT: bltu s1, a3, .LBB178_1 23454; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23455; RV32I-NEXT: # in Loop: Header=BB178_2 Depth=1 23456; RV32I-NEXT: mv a2, s1 23457; RV32I-NEXT: j .LBB178_1 23458; RV32I-NEXT: .LBB178_4: # %atomicrmw.end 23459; RV32I-NEXT: mv a0, a3 23460; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23461; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23462; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23463; RV32I-NEXT: addi sp, sp, 16 23464; RV32I-NEXT: ret 23465; 23466; RV32IA-WMO-LABEL: atomicrmw_umax_i32_acq_rel: 23467; RV32IA-WMO: # %bb.0: 23468; RV32IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0) 23469; RV32IA-WMO-NEXT: ret 23470; 23471; RV32IA-TSO-LABEL: atomicrmw_umax_i32_acq_rel: 23472; RV32IA-TSO: # %bb.0: 23473; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23474; RV32IA-TSO-NEXT: ret 23475; 23476; RV64I-LABEL: atomicrmw_umax_i32_acq_rel: 23477; RV64I: # %bb.0: 23478; RV64I-NEXT: addi sp, sp, -48 23479; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23480; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23481; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23482; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23483; RV64I-NEXT: mv s0, a0 23484; RV64I-NEXT: lw a3, 0(a0) 23485; RV64I-NEXT: mv s1, a1 23486; RV64I-NEXT: sext.w s2, a1 23487; RV64I-NEXT: j .LBB178_2 23488; RV64I-NEXT: .LBB178_1: # %atomicrmw.start 23489; RV64I-NEXT: # in Loop: Header=BB178_2 Depth=1 23490; RV64I-NEXT: sw a3, 12(sp) 23491; RV64I-NEXT: addi a1, sp, 12 23492; RV64I-NEXT: li a3, 4 23493; RV64I-NEXT: li a4, 2 23494; RV64I-NEXT: mv a0, s0 23495; RV64I-NEXT: call __atomic_compare_exchange_4 23496; RV64I-NEXT: lw a3, 12(sp) 23497; RV64I-NEXT: bnez a0, .LBB178_4 23498; RV64I-NEXT: .LBB178_2: # %atomicrmw.start 23499; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23500; RV64I-NEXT: mv a2, a3 23501; RV64I-NEXT: bltu s2, a3, .LBB178_1 23502; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23503; RV64I-NEXT: # in Loop: Header=BB178_2 Depth=1 23504; RV64I-NEXT: mv a2, s1 23505; RV64I-NEXT: j .LBB178_1 23506; RV64I-NEXT: .LBB178_4: # %atomicrmw.end 23507; RV64I-NEXT: mv a0, a3 23508; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23509; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23510; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23511; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23512; RV64I-NEXT: addi sp, sp, 48 23513; RV64I-NEXT: ret 23514; 23515; RV64IA-WMO-LABEL: atomicrmw_umax_i32_acq_rel: 23516; RV64IA-WMO: # %bb.0: 23517; RV64IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0) 23518; RV64IA-WMO-NEXT: ret 23519; 23520; RV64IA-TSO-LABEL: atomicrmw_umax_i32_acq_rel: 23521; RV64IA-TSO: # %bb.0: 23522; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23523; RV64IA-TSO-NEXT: ret 23524 %1 = atomicrmw umax ptr %a, i32 %b acq_rel 23525 ret i32 %1 23526} 23527 23528define i32 @atomicrmw_umax_i32_seq_cst(ptr %a, i32 %b) nounwind { 23529; RV32I-LABEL: atomicrmw_umax_i32_seq_cst: 23530; RV32I: # %bb.0: 23531; RV32I-NEXT: addi sp, sp, -16 23532; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23533; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23534; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23535; RV32I-NEXT: mv s0, a0 23536; RV32I-NEXT: lw a3, 0(a0) 23537; RV32I-NEXT: mv s1, a1 23538; RV32I-NEXT: j .LBB179_2 23539; RV32I-NEXT: .LBB179_1: # %atomicrmw.start 23540; RV32I-NEXT: # in Loop: Header=BB179_2 Depth=1 23541; RV32I-NEXT: sw a3, 0(sp) 23542; RV32I-NEXT: mv a1, sp 23543; RV32I-NEXT: li a3, 5 23544; RV32I-NEXT: li a4, 5 23545; RV32I-NEXT: mv a0, s0 23546; RV32I-NEXT: call __atomic_compare_exchange_4 23547; RV32I-NEXT: lw a3, 0(sp) 23548; RV32I-NEXT: bnez a0, .LBB179_4 23549; RV32I-NEXT: .LBB179_2: # %atomicrmw.start 23550; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23551; RV32I-NEXT: mv a2, a3 23552; RV32I-NEXT: bltu s1, a3, .LBB179_1 23553; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23554; RV32I-NEXT: # in Loop: Header=BB179_2 Depth=1 23555; RV32I-NEXT: mv a2, s1 23556; RV32I-NEXT: j .LBB179_1 23557; RV32I-NEXT: .LBB179_4: # %atomicrmw.end 23558; RV32I-NEXT: mv a0, a3 23559; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23560; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23561; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23562; RV32I-NEXT: addi sp, sp, 16 23563; RV32I-NEXT: ret 23564; 23565; RV32IA-WMO-LABEL: atomicrmw_umax_i32_seq_cst: 23566; RV32IA-WMO: # %bb.0: 23567; RV32IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0) 23568; RV32IA-WMO-NEXT: ret 23569; 23570; RV32IA-TSO-LABEL: atomicrmw_umax_i32_seq_cst: 23571; RV32IA-TSO: # %bb.0: 23572; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23573; RV32IA-TSO-NEXT: ret 23574; 23575; RV64I-LABEL: atomicrmw_umax_i32_seq_cst: 23576; RV64I: # %bb.0: 23577; RV64I-NEXT: addi sp, sp, -48 23578; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23579; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23580; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23581; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23582; RV64I-NEXT: mv s0, a0 23583; RV64I-NEXT: lw a3, 0(a0) 23584; RV64I-NEXT: mv s1, a1 23585; RV64I-NEXT: sext.w s2, a1 23586; RV64I-NEXT: j .LBB179_2 23587; RV64I-NEXT: .LBB179_1: # %atomicrmw.start 23588; RV64I-NEXT: # in Loop: Header=BB179_2 Depth=1 23589; RV64I-NEXT: sw a3, 12(sp) 23590; RV64I-NEXT: addi a1, sp, 12 23591; RV64I-NEXT: li a3, 5 23592; RV64I-NEXT: li a4, 5 23593; RV64I-NEXT: mv a0, s0 23594; RV64I-NEXT: call __atomic_compare_exchange_4 23595; RV64I-NEXT: lw a3, 12(sp) 23596; RV64I-NEXT: bnez a0, .LBB179_4 23597; RV64I-NEXT: .LBB179_2: # %atomicrmw.start 23598; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23599; RV64I-NEXT: mv a2, a3 23600; RV64I-NEXT: bltu s2, a3, .LBB179_1 23601; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23602; RV64I-NEXT: # in Loop: Header=BB179_2 Depth=1 23603; RV64I-NEXT: mv a2, s1 23604; RV64I-NEXT: j .LBB179_1 23605; RV64I-NEXT: .LBB179_4: # %atomicrmw.end 23606; RV64I-NEXT: mv a0, a3 23607; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23608; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23609; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23610; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23611; RV64I-NEXT: addi sp, sp, 48 23612; RV64I-NEXT: ret 23613; 23614; RV64IA-WMO-LABEL: atomicrmw_umax_i32_seq_cst: 23615; RV64IA-WMO: # %bb.0: 23616; RV64IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0) 23617; RV64IA-WMO-NEXT: ret 23618; 23619; RV64IA-TSO-LABEL: atomicrmw_umax_i32_seq_cst: 23620; RV64IA-TSO: # %bb.0: 23621; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0) 23622; RV64IA-TSO-NEXT: ret 23623 %1 = atomicrmw umax ptr %a, i32 %b seq_cst 23624 ret i32 %1 23625} 23626 23627define i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind { 23628; RV32I-LABEL: atomicrmw_umin_i32_monotonic: 23629; RV32I: # %bb.0: 23630; RV32I-NEXT: addi sp, sp, -16 23631; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23632; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23633; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23634; RV32I-NEXT: mv s0, a0 23635; RV32I-NEXT: lw a3, 0(a0) 23636; RV32I-NEXT: mv s1, a1 23637; RV32I-NEXT: j .LBB180_2 23638; RV32I-NEXT: .LBB180_1: # %atomicrmw.start 23639; RV32I-NEXT: # in Loop: Header=BB180_2 Depth=1 23640; RV32I-NEXT: sw a3, 0(sp) 23641; RV32I-NEXT: mv a1, sp 23642; RV32I-NEXT: mv a0, s0 23643; RV32I-NEXT: li a3, 0 23644; RV32I-NEXT: li a4, 0 23645; RV32I-NEXT: call __atomic_compare_exchange_4 23646; RV32I-NEXT: lw a3, 0(sp) 23647; RV32I-NEXT: bnez a0, .LBB180_4 23648; RV32I-NEXT: .LBB180_2: # %atomicrmw.start 23649; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23650; RV32I-NEXT: mv a2, a3 23651; RV32I-NEXT: bgeu s1, a3, .LBB180_1 23652; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23653; RV32I-NEXT: # in Loop: Header=BB180_2 Depth=1 23654; RV32I-NEXT: mv a2, s1 23655; RV32I-NEXT: j .LBB180_1 23656; RV32I-NEXT: .LBB180_4: # %atomicrmw.end 23657; RV32I-NEXT: mv a0, a3 23658; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23659; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23660; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23661; RV32I-NEXT: addi sp, sp, 16 23662; RV32I-NEXT: ret 23663; 23664; RV32IA-LABEL: atomicrmw_umin_i32_monotonic: 23665; RV32IA: # %bb.0: 23666; RV32IA-NEXT: amominu.w a0, a1, (a0) 23667; RV32IA-NEXT: ret 23668; 23669; RV64I-LABEL: atomicrmw_umin_i32_monotonic: 23670; RV64I: # %bb.0: 23671; RV64I-NEXT: addi sp, sp, -48 23672; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23673; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23674; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23675; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23676; RV64I-NEXT: mv s0, a0 23677; RV64I-NEXT: lw a3, 0(a0) 23678; RV64I-NEXT: mv s1, a1 23679; RV64I-NEXT: sext.w s2, a1 23680; RV64I-NEXT: j .LBB180_2 23681; RV64I-NEXT: .LBB180_1: # %atomicrmw.start 23682; RV64I-NEXT: # in Loop: Header=BB180_2 Depth=1 23683; RV64I-NEXT: sw a3, 12(sp) 23684; RV64I-NEXT: addi a1, sp, 12 23685; RV64I-NEXT: mv a0, s0 23686; RV64I-NEXT: li a3, 0 23687; RV64I-NEXT: li a4, 0 23688; RV64I-NEXT: call __atomic_compare_exchange_4 23689; RV64I-NEXT: lw a3, 12(sp) 23690; RV64I-NEXT: bnez a0, .LBB180_4 23691; RV64I-NEXT: .LBB180_2: # %atomicrmw.start 23692; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23693; RV64I-NEXT: mv a2, a3 23694; RV64I-NEXT: bgeu s2, a3, .LBB180_1 23695; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23696; RV64I-NEXT: # in Loop: Header=BB180_2 Depth=1 23697; RV64I-NEXT: mv a2, s1 23698; RV64I-NEXT: j .LBB180_1 23699; RV64I-NEXT: .LBB180_4: # %atomicrmw.end 23700; RV64I-NEXT: mv a0, a3 23701; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23702; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23703; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23704; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23705; RV64I-NEXT: addi sp, sp, 48 23706; RV64I-NEXT: ret 23707; 23708; RV64IA-LABEL: atomicrmw_umin_i32_monotonic: 23709; RV64IA: # %bb.0: 23710; RV64IA-NEXT: amominu.w a0, a1, (a0) 23711; RV64IA-NEXT: ret 23712 %1 = atomicrmw umin ptr %a, i32 %b monotonic 23713 ret i32 %1 23714} 23715 23716define i32 @atomicrmw_umin_i32_acquire(ptr %a, i32 %b) nounwind { 23717; RV32I-LABEL: atomicrmw_umin_i32_acquire: 23718; RV32I: # %bb.0: 23719; RV32I-NEXT: addi sp, sp, -16 23720; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23721; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23722; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23723; RV32I-NEXT: mv s0, a0 23724; RV32I-NEXT: lw a3, 0(a0) 23725; RV32I-NEXT: mv s1, a1 23726; RV32I-NEXT: j .LBB181_2 23727; RV32I-NEXT: .LBB181_1: # %atomicrmw.start 23728; RV32I-NEXT: # in Loop: Header=BB181_2 Depth=1 23729; RV32I-NEXT: sw a3, 0(sp) 23730; RV32I-NEXT: mv a1, sp 23731; RV32I-NEXT: li a3, 2 23732; RV32I-NEXT: li a4, 2 23733; RV32I-NEXT: mv a0, s0 23734; RV32I-NEXT: call __atomic_compare_exchange_4 23735; RV32I-NEXT: lw a3, 0(sp) 23736; RV32I-NEXT: bnez a0, .LBB181_4 23737; RV32I-NEXT: .LBB181_2: # %atomicrmw.start 23738; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23739; RV32I-NEXT: mv a2, a3 23740; RV32I-NEXT: bgeu s1, a3, .LBB181_1 23741; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23742; RV32I-NEXT: # in Loop: Header=BB181_2 Depth=1 23743; RV32I-NEXT: mv a2, s1 23744; RV32I-NEXT: j .LBB181_1 23745; RV32I-NEXT: .LBB181_4: # %atomicrmw.end 23746; RV32I-NEXT: mv a0, a3 23747; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23748; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23749; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23750; RV32I-NEXT: addi sp, sp, 16 23751; RV32I-NEXT: ret 23752; 23753; RV32IA-WMO-LABEL: atomicrmw_umin_i32_acquire: 23754; RV32IA-WMO: # %bb.0: 23755; RV32IA-WMO-NEXT: amominu.w.aq a0, a1, (a0) 23756; RV32IA-WMO-NEXT: ret 23757; 23758; RV32IA-TSO-LABEL: atomicrmw_umin_i32_acquire: 23759; RV32IA-TSO: # %bb.0: 23760; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0) 23761; RV32IA-TSO-NEXT: ret 23762; 23763; RV64I-LABEL: atomicrmw_umin_i32_acquire: 23764; RV64I: # %bb.0: 23765; RV64I-NEXT: addi sp, sp, -48 23766; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23767; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23768; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23769; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23770; RV64I-NEXT: mv s0, a0 23771; RV64I-NEXT: lw a3, 0(a0) 23772; RV64I-NEXT: mv s1, a1 23773; RV64I-NEXT: sext.w s2, a1 23774; RV64I-NEXT: j .LBB181_2 23775; RV64I-NEXT: .LBB181_1: # %atomicrmw.start 23776; RV64I-NEXT: # in Loop: Header=BB181_2 Depth=1 23777; RV64I-NEXT: sw a3, 12(sp) 23778; RV64I-NEXT: addi a1, sp, 12 23779; RV64I-NEXT: li a3, 2 23780; RV64I-NEXT: li a4, 2 23781; RV64I-NEXT: mv a0, s0 23782; RV64I-NEXT: call __atomic_compare_exchange_4 23783; RV64I-NEXT: lw a3, 12(sp) 23784; RV64I-NEXT: bnez a0, .LBB181_4 23785; RV64I-NEXT: .LBB181_2: # %atomicrmw.start 23786; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23787; RV64I-NEXT: mv a2, a3 23788; RV64I-NEXT: bgeu s2, a3, .LBB181_1 23789; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23790; RV64I-NEXT: # in Loop: Header=BB181_2 Depth=1 23791; RV64I-NEXT: mv a2, s1 23792; RV64I-NEXT: j .LBB181_1 23793; RV64I-NEXT: .LBB181_4: # %atomicrmw.end 23794; RV64I-NEXT: mv a0, a3 23795; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23796; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23797; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23798; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23799; RV64I-NEXT: addi sp, sp, 48 23800; RV64I-NEXT: ret 23801; 23802; RV64IA-WMO-LABEL: atomicrmw_umin_i32_acquire: 23803; RV64IA-WMO: # %bb.0: 23804; RV64IA-WMO-NEXT: amominu.w.aq a0, a1, (a0) 23805; RV64IA-WMO-NEXT: ret 23806; 23807; RV64IA-TSO-LABEL: atomicrmw_umin_i32_acquire: 23808; RV64IA-TSO: # %bb.0: 23809; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0) 23810; RV64IA-TSO-NEXT: ret 23811 %1 = atomicrmw umin ptr %a, i32 %b acquire 23812 ret i32 %1 23813} 23814 23815define i32 @atomicrmw_umin_i32_release(ptr %a, i32 %b) nounwind { 23816; RV32I-LABEL: atomicrmw_umin_i32_release: 23817; RV32I: # %bb.0: 23818; RV32I-NEXT: addi sp, sp, -16 23819; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23820; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23821; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23822; RV32I-NEXT: mv s0, a0 23823; RV32I-NEXT: lw a3, 0(a0) 23824; RV32I-NEXT: mv s1, a1 23825; RV32I-NEXT: j .LBB182_2 23826; RV32I-NEXT: .LBB182_1: # %atomicrmw.start 23827; RV32I-NEXT: # in Loop: Header=BB182_2 Depth=1 23828; RV32I-NEXT: sw a3, 0(sp) 23829; RV32I-NEXT: mv a1, sp 23830; RV32I-NEXT: li a3, 3 23831; RV32I-NEXT: mv a0, s0 23832; RV32I-NEXT: li a4, 0 23833; RV32I-NEXT: call __atomic_compare_exchange_4 23834; RV32I-NEXT: lw a3, 0(sp) 23835; RV32I-NEXT: bnez a0, .LBB182_4 23836; RV32I-NEXT: .LBB182_2: # %atomicrmw.start 23837; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23838; RV32I-NEXT: mv a2, a3 23839; RV32I-NEXT: bgeu s1, a3, .LBB182_1 23840; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23841; RV32I-NEXT: # in Loop: Header=BB182_2 Depth=1 23842; RV32I-NEXT: mv a2, s1 23843; RV32I-NEXT: j .LBB182_1 23844; RV32I-NEXT: .LBB182_4: # %atomicrmw.end 23845; RV32I-NEXT: mv a0, a3 23846; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23847; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23848; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23849; RV32I-NEXT: addi sp, sp, 16 23850; RV32I-NEXT: ret 23851; 23852; RV32IA-WMO-LABEL: atomicrmw_umin_i32_release: 23853; RV32IA-WMO: # %bb.0: 23854; RV32IA-WMO-NEXT: amominu.w.rl a0, a1, (a0) 23855; RV32IA-WMO-NEXT: ret 23856; 23857; RV32IA-TSO-LABEL: atomicrmw_umin_i32_release: 23858; RV32IA-TSO: # %bb.0: 23859; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0) 23860; RV32IA-TSO-NEXT: ret 23861; 23862; RV64I-LABEL: atomicrmw_umin_i32_release: 23863; RV64I: # %bb.0: 23864; RV64I-NEXT: addi sp, sp, -48 23865; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23866; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23867; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23868; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23869; RV64I-NEXT: mv s0, a0 23870; RV64I-NEXT: lw a3, 0(a0) 23871; RV64I-NEXT: mv s1, a1 23872; RV64I-NEXT: sext.w s2, a1 23873; RV64I-NEXT: j .LBB182_2 23874; RV64I-NEXT: .LBB182_1: # %atomicrmw.start 23875; RV64I-NEXT: # in Loop: Header=BB182_2 Depth=1 23876; RV64I-NEXT: sw a3, 12(sp) 23877; RV64I-NEXT: addi a1, sp, 12 23878; RV64I-NEXT: li a3, 3 23879; RV64I-NEXT: mv a0, s0 23880; RV64I-NEXT: li a4, 0 23881; RV64I-NEXT: call __atomic_compare_exchange_4 23882; RV64I-NEXT: lw a3, 12(sp) 23883; RV64I-NEXT: bnez a0, .LBB182_4 23884; RV64I-NEXT: .LBB182_2: # %atomicrmw.start 23885; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23886; RV64I-NEXT: mv a2, a3 23887; RV64I-NEXT: bgeu s2, a3, .LBB182_1 23888; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23889; RV64I-NEXT: # in Loop: Header=BB182_2 Depth=1 23890; RV64I-NEXT: mv a2, s1 23891; RV64I-NEXT: j .LBB182_1 23892; RV64I-NEXT: .LBB182_4: # %atomicrmw.end 23893; RV64I-NEXT: mv a0, a3 23894; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23895; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23896; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23897; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23898; RV64I-NEXT: addi sp, sp, 48 23899; RV64I-NEXT: ret 23900; 23901; RV64IA-WMO-LABEL: atomicrmw_umin_i32_release: 23902; RV64IA-WMO: # %bb.0: 23903; RV64IA-WMO-NEXT: amominu.w.rl a0, a1, (a0) 23904; RV64IA-WMO-NEXT: ret 23905; 23906; RV64IA-TSO-LABEL: atomicrmw_umin_i32_release: 23907; RV64IA-TSO: # %bb.0: 23908; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0) 23909; RV64IA-TSO-NEXT: ret 23910 %1 = atomicrmw umin ptr %a, i32 %b release 23911 ret i32 %1 23912} 23913 23914define i32 @atomicrmw_umin_i32_acq_rel(ptr %a, i32 %b) nounwind { 23915; RV32I-LABEL: atomicrmw_umin_i32_acq_rel: 23916; RV32I: # %bb.0: 23917; RV32I-NEXT: addi sp, sp, -16 23918; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 23919; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 23920; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 23921; RV32I-NEXT: mv s0, a0 23922; RV32I-NEXT: lw a3, 0(a0) 23923; RV32I-NEXT: mv s1, a1 23924; RV32I-NEXT: j .LBB183_2 23925; RV32I-NEXT: .LBB183_1: # %atomicrmw.start 23926; RV32I-NEXT: # in Loop: Header=BB183_2 Depth=1 23927; RV32I-NEXT: sw a3, 0(sp) 23928; RV32I-NEXT: mv a1, sp 23929; RV32I-NEXT: li a3, 4 23930; RV32I-NEXT: li a4, 2 23931; RV32I-NEXT: mv a0, s0 23932; RV32I-NEXT: call __atomic_compare_exchange_4 23933; RV32I-NEXT: lw a3, 0(sp) 23934; RV32I-NEXT: bnez a0, .LBB183_4 23935; RV32I-NEXT: .LBB183_2: # %atomicrmw.start 23936; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 23937; RV32I-NEXT: mv a2, a3 23938; RV32I-NEXT: bgeu s1, a3, .LBB183_1 23939; RV32I-NEXT: # %bb.3: # %atomicrmw.start 23940; RV32I-NEXT: # in Loop: Header=BB183_2 Depth=1 23941; RV32I-NEXT: mv a2, s1 23942; RV32I-NEXT: j .LBB183_1 23943; RV32I-NEXT: .LBB183_4: # %atomicrmw.end 23944; RV32I-NEXT: mv a0, a3 23945; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 23946; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 23947; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 23948; RV32I-NEXT: addi sp, sp, 16 23949; RV32I-NEXT: ret 23950; 23951; RV32IA-WMO-LABEL: atomicrmw_umin_i32_acq_rel: 23952; RV32IA-WMO: # %bb.0: 23953; RV32IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0) 23954; RV32IA-WMO-NEXT: ret 23955; 23956; RV32IA-TSO-LABEL: atomicrmw_umin_i32_acq_rel: 23957; RV32IA-TSO: # %bb.0: 23958; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0) 23959; RV32IA-TSO-NEXT: ret 23960; 23961; RV64I-LABEL: atomicrmw_umin_i32_acq_rel: 23962; RV64I: # %bb.0: 23963; RV64I-NEXT: addi sp, sp, -48 23964; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 23965; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 23966; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 23967; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 23968; RV64I-NEXT: mv s0, a0 23969; RV64I-NEXT: lw a3, 0(a0) 23970; RV64I-NEXT: mv s1, a1 23971; RV64I-NEXT: sext.w s2, a1 23972; RV64I-NEXT: j .LBB183_2 23973; RV64I-NEXT: .LBB183_1: # %atomicrmw.start 23974; RV64I-NEXT: # in Loop: Header=BB183_2 Depth=1 23975; RV64I-NEXT: sw a3, 12(sp) 23976; RV64I-NEXT: addi a1, sp, 12 23977; RV64I-NEXT: li a3, 4 23978; RV64I-NEXT: li a4, 2 23979; RV64I-NEXT: mv a0, s0 23980; RV64I-NEXT: call __atomic_compare_exchange_4 23981; RV64I-NEXT: lw a3, 12(sp) 23982; RV64I-NEXT: bnez a0, .LBB183_4 23983; RV64I-NEXT: .LBB183_2: # %atomicrmw.start 23984; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 23985; RV64I-NEXT: mv a2, a3 23986; RV64I-NEXT: bgeu s2, a3, .LBB183_1 23987; RV64I-NEXT: # %bb.3: # %atomicrmw.start 23988; RV64I-NEXT: # in Loop: Header=BB183_2 Depth=1 23989; RV64I-NEXT: mv a2, s1 23990; RV64I-NEXT: j .LBB183_1 23991; RV64I-NEXT: .LBB183_4: # %atomicrmw.end 23992; RV64I-NEXT: mv a0, a3 23993; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 23994; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 23995; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 23996; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 23997; RV64I-NEXT: addi sp, sp, 48 23998; RV64I-NEXT: ret 23999; 24000; RV64IA-WMO-LABEL: atomicrmw_umin_i32_acq_rel: 24001; RV64IA-WMO: # %bb.0: 24002; RV64IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0) 24003; RV64IA-WMO-NEXT: ret 24004; 24005; RV64IA-TSO-LABEL: atomicrmw_umin_i32_acq_rel: 24006; RV64IA-TSO: # %bb.0: 24007; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0) 24008; RV64IA-TSO-NEXT: ret 24009 %1 = atomicrmw umin ptr %a, i32 %b acq_rel 24010 ret i32 %1 24011} 24012 24013define i32 @atomicrmw_umin_i32_seq_cst(ptr %a, i32 %b) nounwind { 24014; RV32I-LABEL: atomicrmw_umin_i32_seq_cst: 24015; RV32I: # %bb.0: 24016; RV32I-NEXT: addi sp, sp, -16 24017; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24018; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 24019; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 24020; RV32I-NEXT: mv s0, a0 24021; RV32I-NEXT: lw a3, 0(a0) 24022; RV32I-NEXT: mv s1, a1 24023; RV32I-NEXT: j .LBB184_2 24024; RV32I-NEXT: .LBB184_1: # %atomicrmw.start 24025; RV32I-NEXT: # in Loop: Header=BB184_2 Depth=1 24026; RV32I-NEXT: sw a3, 0(sp) 24027; RV32I-NEXT: mv a1, sp 24028; RV32I-NEXT: li a3, 5 24029; RV32I-NEXT: li a4, 5 24030; RV32I-NEXT: mv a0, s0 24031; RV32I-NEXT: call __atomic_compare_exchange_4 24032; RV32I-NEXT: lw a3, 0(sp) 24033; RV32I-NEXT: bnez a0, .LBB184_4 24034; RV32I-NEXT: .LBB184_2: # %atomicrmw.start 24035; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 24036; RV32I-NEXT: mv a2, a3 24037; RV32I-NEXT: bgeu s1, a3, .LBB184_1 24038; RV32I-NEXT: # %bb.3: # %atomicrmw.start 24039; RV32I-NEXT: # in Loop: Header=BB184_2 Depth=1 24040; RV32I-NEXT: mv a2, s1 24041; RV32I-NEXT: j .LBB184_1 24042; RV32I-NEXT: .LBB184_4: # %atomicrmw.end 24043; RV32I-NEXT: mv a0, a3 24044; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24045; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 24046; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 24047; RV32I-NEXT: addi sp, sp, 16 24048; RV32I-NEXT: ret 24049; 24050; RV32IA-WMO-LABEL: atomicrmw_umin_i32_seq_cst: 24051; RV32IA-WMO: # %bb.0: 24052; RV32IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0) 24053; RV32IA-WMO-NEXT: ret 24054; 24055; RV32IA-TSO-LABEL: atomicrmw_umin_i32_seq_cst: 24056; RV32IA-TSO: # %bb.0: 24057; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0) 24058; RV32IA-TSO-NEXT: ret 24059; 24060; RV64I-LABEL: atomicrmw_umin_i32_seq_cst: 24061; RV64I: # %bb.0: 24062; RV64I-NEXT: addi sp, sp, -48 24063; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 24064; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 24065; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 24066; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 24067; RV64I-NEXT: mv s0, a0 24068; RV64I-NEXT: lw a3, 0(a0) 24069; RV64I-NEXT: mv s1, a1 24070; RV64I-NEXT: sext.w s2, a1 24071; RV64I-NEXT: j .LBB184_2 24072; RV64I-NEXT: .LBB184_1: # %atomicrmw.start 24073; RV64I-NEXT: # in Loop: Header=BB184_2 Depth=1 24074; RV64I-NEXT: sw a3, 12(sp) 24075; RV64I-NEXT: addi a1, sp, 12 24076; RV64I-NEXT: li a3, 5 24077; RV64I-NEXT: li a4, 5 24078; RV64I-NEXT: mv a0, s0 24079; RV64I-NEXT: call __atomic_compare_exchange_4 24080; RV64I-NEXT: lw a3, 12(sp) 24081; RV64I-NEXT: bnez a0, .LBB184_4 24082; RV64I-NEXT: .LBB184_2: # %atomicrmw.start 24083; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 24084; RV64I-NEXT: mv a2, a3 24085; RV64I-NEXT: bgeu s2, a3, .LBB184_1 24086; RV64I-NEXT: # %bb.3: # %atomicrmw.start 24087; RV64I-NEXT: # in Loop: Header=BB184_2 Depth=1 24088; RV64I-NEXT: mv a2, s1 24089; RV64I-NEXT: j .LBB184_1 24090; RV64I-NEXT: .LBB184_4: # %atomicrmw.end 24091; RV64I-NEXT: mv a0, a3 24092; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 24093; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 24094; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 24095; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 24096; RV64I-NEXT: addi sp, sp, 48 24097; RV64I-NEXT: ret 24098; 24099; RV64IA-WMO-LABEL: atomicrmw_umin_i32_seq_cst: 24100; RV64IA-WMO: # %bb.0: 24101; RV64IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0) 24102; RV64IA-WMO-NEXT: ret 24103; 24104; RV64IA-TSO-LABEL: atomicrmw_umin_i32_seq_cst: 24105; RV64IA-TSO: # %bb.0: 24106; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0) 24107; RV64IA-TSO-NEXT: ret 24108 %1 = atomicrmw umin ptr %a, i32 %b seq_cst 24109 ret i32 %1 24110} 24111 24112define i64 @atomicrmw_xchg_i64_monotonic(ptr %a, i64 %b) nounwind { 24113; RV32I-LABEL: atomicrmw_xchg_i64_monotonic: 24114; RV32I: # %bb.0: 24115; RV32I-NEXT: addi sp, sp, -16 24116; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24117; RV32I-NEXT: li a3, 0 24118; RV32I-NEXT: call __atomic_exchange_8 24119; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24120; RV32I-NEXT: addi sp, sp, 16 24121; RV32I-NEXT: ret 24122; 24123; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic: 24124; RV32IA: # %bb.0: 24125; RV32IA-NEXT: addi sp, sp, -16 24126; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24127; RV32IA-NEXT: li a3, 0 24128; RV32IA-NEXT: call __atomic_exchange_8 24129; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24130; RV32IA-NEXT: addi sp, sp, 16 24131; RV32IA-NEXT: ret 24132; 24133; RV64I-LABEL: atomicrmw_xchg_i64_monotonic: 24134; RV64I: # %bb.0: 24135; RV64I-NEXT: addi sp, sp, -16 24136; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24137; RV64I-NEXT: li a2, 0 24138; RV64I-NEXT: call __atomic_exchange_8 24139; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24140; RV64I-NEXT: addi sp, sp, 16 24141; RV64I-NEXT: ret 24142; 24143; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic: 24144; RV64IA: # %bb.0: 24145; RV64IA-NEXT: amoswap.d a0, a1, (a0) 24146; RV64IA-NEXT: ret 24147 %1 = atomicrmw xchg ptr %a, i64 %b monotonic 24148 ret i64 %1 24149} 24150 24151define i64 @atomicrmw_xchg_i64_acquire(ptr %a, i64 %b) nounwind { 24152; RV32I-LABEL: atomicrmw_xchg_i64_acquire: 24153; RV32I: # %bb.0: 24154; RV32I-NEXT: addi sp, sp, -16 24155; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24156; RV32I-NEXT: li a3, 2 24157; RV32I-NEXT: call __atomic_exchange_8 24158; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24159; RV32I-NEXT: addi sp, sp, 16 24160; RV32I-NEXT: ret 24161; 24162; RV32IA-LABEL: atomicrmw_xchg_i64_acquire: 24163; RV32IA: # %bb.0: 24164; RV32IA-NEXT: addi sp, sp, -16 24165; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24166; RV32IA-NEXT: li a3, 2 24167; RV32IA-NEXT: call __atomic_exchange_8 24168; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24169; RV32IA-NEXT: addi sp, sp, 16 24170; RV32IA-NEXT: ret 24171; 24172; RV64I-LABEL: atomicrmw_xchg_i64_acquire: 24173; RV64I: # %bb.0: 24174; RV64I-NEXT: addi sp, sp, -16 24175; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24176; RV64I-NEXT: li a2, 2 24177; RV64I-NEXT: call __atomic_exchange_8 24178; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24179; RV64I-NEXT: addi sp, sp, 16 24180; RV64I-NEXT: ret 24181; 24182; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_acquire: 24183; RV64IA-WMO: # %bb.0: 24184; RV64IA-WMO-NEXT: amoswap.d.aq a0, a1, (a0) 24185; RV64IA-WMO-NEXT: ret 24186; 24187; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_acquire: 24188; RV64IA-TSO: # %bb.0: 24189; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0) 24190; RV64IA-TSO-NEXT: ret 24191 %1 = atomicrmw xchg ptr %a, i64 %b acquire 24192 ret i64 %1 24193} 24194 24195define i64 @atomicrmw_xchg_i64_release(ptr %a, i64 %b) nounwind { 24196; RV32I-LABEL: atomicrmw_xchg_i64_release: 24197; RV32I: # %bb.0: 24198; RV32I-NEXT: addi sp, sp, -16 24199; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24200; RV32I-NEXT: li a3, 3 24201; RV32I-NEXT: call __atomic_exchange_8 24202; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24203; RV32I-NEXT: addi sp, sp, 16 24204; RV32I-NEXT: ret 24205; 24206; RV32IA-LABEL: atomicrmw_xchg_i64_release: 24207; RV32IA: # %bb.0: 24208; RV32IA-NEXT: addi sp, sp, -16 24209; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24210; RV32IA-NEXT: li a3, 3 24211; RV32IA-NEXT: call __atomic_exchange_8 24212; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24213; RV32IA-NEXT: addi sp, sp, 16 24214; RV32IA-NEXT: ret 24215; 24216; RV64I-LABEL: atomicrmw_xchg_i64_release: 24217; RV64I: # %bb.0: 24218; RV64I-NEXT: addi sp, sp, -16 24219; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24220; RV64I-NEXT: li a2, 3 24221; RV64I-NEXT: call __atomic_exchange_8 24222; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24223; RV64I-NEXT: addi sp, sp, 16 24224; RV64I-NEXT: ret 24225; 24226; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_release: 24227; RV64IA-WMO: # %bb.0: 24228; RV64IA-WMO-NEXT: amoswap.d.rl a0, a1, (a0) 24229; RV64IA-WMO-NEXT: ret 24230; 24231; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_release: 24232; RV64IA-TSO: # %bb.0: 24233; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0) 24234; RV64IA-TSO-NEXT: ret 24235 %1 = atomicrmw xchg ptr %a, i64 %b release 24236 ret i64 %1 24237} 24238 24239define i64 @atomicrmw_xchg_i64_acq_rel(ptr %a, i64 %b) nounwind { 24240; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel: 24241; RV32I: # %bb.0: 24242; RV32I-NEXT: addi sp, sp, -16 24243; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24244; RV32I-NEXT: li a3, 4 24245; RV32I-NEXT: call __atomic_exchange_8 24246; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24247; RV32I-NEXT: addi sp, sp, 16 24248; RV32I-NEXT: ret 24249; 24250; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel: 24251; RV32IA: # %bb.0: 24252; RV32IA-NEXT: addi sp, sp, -16 24253; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24254; RV32IA-NEXT: li a3, 4 24255; RV32IA-NEXT: call __atomic_exchange_8 24256; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24257; RV32IA-NEXT: addi sp, sp, 16 24258; RV32IA-NEXT: ret 24259; 24260; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel: 24261; RV64I: # %bb.0: 24262; RV64I-NEXT: addi sp, sp, -16 24263; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24264; RV64I-NEXT: li a2, 4 24265; RV64I-NEXT: call __atomic_exchange_8 24266; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24267; RV64I-NEXT: addi sp, sp, 16 24268; RV64I-NEXT: ret 24269; 24270; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_acq_rel: 24271; RV64IA-WMO: # %bb.0: 24272; RV64IA-WMO-NEXT: amoswap.d.aqrl a0, a1, (a0) 24273; RV64IA-WMO-NEXT: ret 24274; 24275; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_acq_rel: 24276; RV64IA-TSO: # %bb.0: 24277; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0) 24278; RV64IA-TSO-NEXT: ret 24279 %1 = atomicrmw xchg ptr %a, i64 %b acq_rel 24280 ret i64 %1 24281} 24282 24283define i64 @atomicrmw_xchg_i64_seq_cst(ptr %a, i64 %b) nounwind { 24284; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst: 24285; RV32I: # %bb.0: 24286; RV32I-NEXT: addi sp, sp, -16 24287; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24288; RV32I-NEXT: li a3, 5 24289; RV32I-NEXT: call __atomic_exchange_8 24290; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24291; RV32I-NEXT: addi sp, sp, 16 24292; RV32I-NEXT: ret 24293; 24294; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst: 24295; RV32IA: # %bb.0: 24296; RV32IA-NEXT: addi sp, sp, -16 24297; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24298; RV32IA-NEXT: li a3, 5 24299; RV32IA-NEXT: call __atomic_exchange_8 24300; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24301; RV32IA-NEXT: addi sp, sp, 16 24302; RV32IA-NEXT: ret 24303; 24304; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst: 24305; RV64I: # %bb.0: 24306; RV64I-NEXT: addi sp, sp, -16 24307; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24308; RV64I-NEXT: li a2, 5 24309; RV64I-NEXT: call __atomic_exchange_8 24310; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24311; RV64I-NEXT: addi sp, sp, 16 24312; RV64I-NEXT: ret 24313; 24314; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_seq_cst: 24315; RV64IA-WMO: # %bb.0: 24316; RV64IA-WMO-NEXT: amoswap.d.aqrl a0, a1, (a0) 24317; RV64IA-WMO-NEXT: ret 24318; 24319; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_seq_cst: 24320; RV64IA-TSO: # %bb.0: 24321; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0) 24322; RV64IA-TSO-NEXT: ret 24323 %1 = atomicrmw xchg ptr %a, i64 %b seq_cst 24324 ret i64 %1 24325} 24326 24327define i64 @atomicrmw_add_i64_monotonic(ptr %a, i64 %b) nounwind { 24328; RV32I-LABEL: atomicrmw_add_i64_monotonic: 24329; RV32I: # %bb.0: 24330; RV32I-NEXT: addi sp, sp, -16 24331; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24332; RV32I-NEXT: li a3, 0 24333; RV32I-NEXT: call __atomic_fetch_add_8 24334; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24335; RV32I-NEXT: addi sp, sp, 16 24336; RV32I-NEXT: ret 24337; 24338; RV32IA-LABEL: atomicrmw_add_i64_monotonic: 24339; RV32IA: # %bb.0: 24340; RV32IA-NEXT: addi sp, sp, -16 24341; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24342; RV32IA-NEXT: li a3, 0 24343; RV32IA-NEXT: call __atomic_fetch_add_8 24344; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24345; RV32IA-NEXT: addi sp, sp, 16 24346; RV32IA-NEXT: ret 24347; 24348; RV64I-LABEL: atomicrmw_add_i64_monotonic: 24349; RV64I: # %bb.0: 24350; RV64I-NEXT: addi sp, sp, -16 24351; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24352; RV64I-NEXT: li a2, 0 24353; RV64I-NEXT: call __atomic_fetch_add_8 24354; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24355; RV64I-NEXT: addi sp, sp, 16 24356; RV64I-NEXT: ret 24357; 24358; RV64IA-LABEL: atomicrmw_add_i64_monotonic: 24359; RV64IA: # %bb.0: 24360; RV64IA-NEXT: amoadd.d a0, a1, (a0) 24361; RV64IA-NEXT: ret 24362 %1 = atomicrmw add ptr %a, i64 %b monotonic 24363 ret i64 %1 24364} 24365 24366define i64 @atomicrmw_add_i64_acquire(ptr %a, i64 %b) nounwind { 24367; RV32I-LABEL: atomicrmw_add_i64_acquire: 24368; RV32I: # %bb.0: 24369; RV32I-NEXT: addi sp, sp, -16 24370; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24371; RV32I-NEXT: li a3, 2 24372; RV32I-NEXT: call __atomic_fetch_add_8 24373; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24374; RV32I-NEXT: addi sp, sp, 16 24375; RV32I-NEXT: ret 24376; 24377; RV32IA-LABEL: atomicrmw_add_i64_acquire: 24378; RV32IA: # %bb.0: 24379; RV32IA-NEXT: addi sp, sp, -16 24380; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24381; RV32IA-NEXT: li a3, 2 24382; RV32IA-NEXT: call __atomic_fetch_add_8 24383; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24384; RV32IA-NEXT: addi sp, sp, 16 24385; RV32IA-NEXT: ret 24386; 24387; RV64I-LABEL: atomicrmw_add_i64_acquire: 24388; RV64I: # %bb.0: 24389; RV64I-NEXT: addi sp, sp, -16 24390; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24391; RV64I-NEXT: li a2, 2 24392; RV64I-NEXT: call __atomic_fetch_add_8 24393; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24394; RV64I-NEXT: addi sp, sp, 16 24395; RV64I-NEXT: ret 24396; 24397; RV64IA-WMO-LABEL: atomicrmw_add_i64_acquire: 24398; RV64IA-WMO: # %bb.0: 24399; RV64IA-WMO-NEXT: amoadd.d.aq a0, a1, (a0) 24400; RV64IA-WMO-NEXT: ret 24401; 24402; RV64IA-TSO-LABEL: atomicrmw_add_i64_acquire: 24403; RV64IA-TSO: # %bb.0: 24404; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24405; RV64IA-TSO-NEXT: ret 24406 %1 = atomicrmw add ptr %a, i64 %b acquire 24407 ret i64 %1 24408} 24409 24410define i64 @atomicrmw_add_i64_release(ptr %a, i64 %b) nounwind { 24411; RV32I-LABEL: atomicrmw_add_i64_release: 24412; RV32I: # %bb.0: 24413; RV32I-NEXT: addi sp, sp, -16 24414; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24415; RV32I-NEXT: li a3, 3 24416; RV32I-NEXT: call __atomic_fetch_add_8 24417; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24418; RV32I-NEXT: addi sp, sp, 16 24419; RV32I-NEXT: ret 24420; 24421; RV32IA-LABEL: atomicrmw_add_i64_release: 24422; RV32IA: # %bb.0: 24423; RV32IA-NEXT: addi sp, sp, -16 24424; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24425; RV32IA-NEXT: li a3, 3 24426; RV32IA-NEXT: call __atomic_fetch_add_8 24427; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24428; RV32IA-NEXT: addi sp, sp, 16 24429; RV32IA-NEXT: ret 24430; 24431; RV64I-LABEL: atomicrmw_add_i64_release: 24432; RV64I: # %bb.0: 24433; RV64I-NEXT: addi sp, sp, -16 24434; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24435; RV64I-NEXT: li a2, 3 24436; RV64I-NEXT: call __atomic_fetch_add_8 24437; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24438; RV64I-NEXT: addi sp, sp, 16 24439; RV64I-NEXT: ret 24440; 24441; RV64IA-WMO-LABEL: atomicrmw_add_i64_release: 24442; RV64IA-WMO: # %bb.0: 24443; RV64IA-WMO-NEXT: amoadd.d.rl a0, a1, (a0) 24444; RV64IA-WMO-NEXT: ret 24445; 24446; RV64IA-TSO-LABEL: atomicrmw_add_i64_release: 24447; RV64IA-TSO: # %bb.0: 24448; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24449; RV64IA-TSO-NEXT: ret 24450 %1 = atomicrmw add ptr %a, i64 %b release 24451 ret i64 %1 24452} 24453 24454define i64 @atomicrmw_add_i64_acq_rel(ptr %a, i64 %b) nounwind { 24455; RV32I-LABEL: atomicrmw_add_i64_acq_rel: 24456; RV32I: # %bb.0: 24457; RV32I-NEXT: addi sp, sp, -16 24458; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24459; RV32I-NEXT: li a3, 4 24460; RV32I-NEXT: call __atomic_fetch_add_8 24461; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24462; RV32I-NEXT: addi sp, sp, 16 24463; RV32I-NEXT: ret 24464; 24465; RV32IA-LABEL: atomicrmw_add_i64_acq_rel: 24466; RV32IA: # %bb.0: 24467; RV32IA-NEXT: addi sp, sp, -16 24468; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24469; RV32IA-NEXT: li a3, 4 24470; RV32IA-NEXT: call __atomic_fetch_add_8 24471; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24472; RV32IA-NEXT: addi sp, sp, 16 24473; RV32IA-NEXT: ret 24474; 24475; RV64I-LABEL: atomicrmw_add_i64_acq_rel: 24476; RV64I: # %bb.0: 24477; RV64I-NEXT: addi sp, sp, -16 24478; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24479; RV64I-NEXT: li a2, 4 24480; RV64I-NEXT: call __atomic_fetch_add_8 24481; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24482; RV64I-NEXT: addi sp, sp, 16 24483; RV64I-NEXT: ret 24484; 24485; RV64IA-WMO-LABEL: atomicrmw_add_i64_acq_rel: 24486; RV64IA-WMO: # %bb.0: 24487; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0) 24488; RV64IA-WMO-NEXT: ret 24489; 24490; RV64IA-TSO-LABEL: atomicrmw_add_i64_acq_rel: 24491; RV64IA-TSO: # %bb.0: 24492; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24493; RV64IA-TSO-NEXT: ret 24494 %1 = atomicrmw add ptr %a, i64 %b acq_rel 24495 ret i64 %1 24496} 24497 24498define i64 @atomicrmw_add_i64_seq_cst(ptr %a, i64 %b) nounwind { 24499; RV32I-LABEL: atomicrmw_add_i64_seq_cst: 24500; RV32I: # %bb.0: 24501; RV32I-NEXT: addi sp, sp, -16 24502; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24503; RV32I-NEXT: li a3, 5 24504; RV32I-NEXT: call __atomic_fetch_add_8 24505; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24506; RV32I-NEXT: addi sp, sp, 16 24507; RV32I-NEXT: ret 24508; 24509; RV32IA-LABEL: atomicrmw_add_i64_seq_cst: 24510; RV32IA: # %bb.0: 24511; RV32IA-NEXT: addi sp, sp, -16 24512; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24513; RV32IA-NEXT: li a3, 5 24514; RV32IA-NEXT: call __atomic_fetch_add_8 24515; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24516; RV32IA-NEXT: addi sp, sp, 16 24517; RV32IA-NEXT: ret 24518; 24519; RV64I-LABEL: atomicrmw_add_i64_seq_cst: 24520; RV64I: # %bb.0: 24521; RV64I-NEXT: addi sp, sp, -16 24522; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24523; RV64I-NEXT: li a2, 5 24524; RV64I-NEXT: call __atomic_fetch_add_8 24525; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24526; RV64I-NEXT: addi sp, sp, 16 24527; RV64I-NEXT: ret 24528; 24529; RV64IA-WMO-LABEL: atomicrmw_add_i64_seq_cst: 24530; RV64IA-WMO: # %bb.0: 24531; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0) 24532; RV64IA-WMO-NEXT: ret 24533; 24534; RV64IA-TSO-LABEL: atomicrmw_add_i64_seq_cst: 24535; RV64IA-TSO: # %bb.0: 24536; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24537; RV64IA-TSO-NEXT: ret 24538 %1 = atomicrmw add ptr %a, i64 %b seq_cst 24539 ret i64 %1 24540} 24541 24542define i64 @atomicrmw_sub_i64_monotonic(ptr %a, i64 %b) nounwind { 24543; RV32I-LABEL: atomicrmw_sub_i64_monotonic: 24544; RV32I: # %bb.0: 24545; RV32I-NEXT: addi sp, sp, -16 24546; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24547; RV32I-NEXT: li a3, 0 24548; RV32I-NEXT: call __atomic_fetch_sub_8 24549; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24550; RV32I-NEXT: addi sp, sp, 16 24551; RV32I-NEXT: ret 24552; 24553; RV32IA-LABEL: atomicrmw_sub_i64_monotonic: 24554; RV32IA: # %bb.0: 24555; RV32IA-NEXT: addi sp, sp, -16 24556; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24557; RV32IA-NEXT: li a3, 0 24558; RV32IA-NEXT: call __atomic_fetch_sub_8 24559; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24560; RV32IA-NEXT: addi sp, sp, 16 24561; RV32IA-NEXT: ret 24562; 24563; RV64I-LABEL: atomicrmw_sub_i64_monotonic: 24564; RV64I: # %bb.0: 24565; RV64I-NEXT: addi sp, sp, -16 24566; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24567; RV64I-NEXT: li a2, 0 24568; RV64I-NEXT: call __atomic_fetch_sub_8 24569; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24570; RV64I-NEXT: addi sp, sp, 16 24571; RV64I-NEXT: ret 24572; 24573; RV64IA-LABEL: atomicrmw_sub_i64_monotonic: 24574; RV64IA: # %bb.0: 24575; RV64IA-NEXT: neg a1, a1 24576; RV64IA-NEXT: amoadd.d a0, a1, (a0) 24577; RV64IA-NEXT: ret 24578 %1 = atomicrmw sub ptr %a, i64 %b monotonic 24579 ret i64 %1 24580} 24581 24582define i64 @atomicrmw_sub_i64_acquire(ptr %a, i64 %b) nounwind { 24583; RV32I-LABEL: atomicrmw_sub_i64_acquire: 24584; RV32I: # %bb.0: 24585; RV32I-NEXT: addi sp, sp, -16 24586; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24587; RV32I-NEXT: li a3, 2 24588; RV32I-NEXT: call __atomic_fetch_sub_8 24589; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24590; RV32I-NEXT: addi sp, sp, 16 24591; RV32I-NEXT: ret 24592; 24593; RV32IA-LABEL: atomicrmw_sub_i64_acquire: 24594; RV32IA: # %bb.0: 24595; RV32IA-NEXT: addi sp, sp, -16 24596; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24597; RV32IA-NEXT: li a3, 2 24598; RV32IA-NEXT: call __atomic_fetch_sub_8 24599; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24600; RV32IA-NEXT: addi sp, sp, 16 24601; RV32IA-NEXT: ret 24602; 24603; RV64I-LABEL: atomicrmw_sub_i64_acquire: 24604; RV64I: # %bb.0: 24605; RV64I-NEXT: addi sp, sp, -16 24606; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24607; RV64I-NEXT: li a2, 2 24608; RV64I-NEXT: call __atomic_fetch_sub_8 24609; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24610; RV64I-NEXT: addi sp, sp, 16 24611; RV64I-NEXT: ret 24612; 24613; RV64IA-WMO-LABEL: atomicrmw_sub_i64_acquire: 24614; RV64IA-WMO: # %bb.0: 24615; RV64IA-WMO-NEXT: neg a1, a1 24616; RV64IA-WMO-NEXT: amoadd.d.aq a0, a1, (a0) 24617; RV64IA-WMO-NEXT: ret 24618; 24619; RV64IA-TSO-LABEL: atomicrmw_sub_i64_acquire: 24620; RV64IA-TSO: # %bb.0: 24621; RV64IA-TSO-NEXT: neg a1, a1 24622; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24623; RV64IA-TSO-NEXT: ret 24624 %1 = atomicrmw sub ptr %a, i64 %b acquire 24625 ret i64 %1 24626} 24627 24628define i64 @atomicrmw_sub_i64_release(ptr %a, i64 %b) nounwind { 24629; RV32I-LABEL: atomicrmw_sub_i64_release: 24630; RV32I: # %bb.0: 24631; RV32I-NEXT: addi sp, sp, -16 24632; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24633; RV32I-NEXT: li a3, 3 24634; RV32I-NEXT: call __atomic_fetch_sub_8 24635; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24636; RV32I-NEXT: addi sp, sp, 16 24637; RV32I-NEXT: ret 24638; 24639; RV32IA-LABEL: atomicrmw_sub_i64_release: 24640; RV32IA: # %bb.0: 24641; RV32IA-NEXT: addi sp, sp, -16 24642; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24643; RV32IA-NEXT: li a3, 3 24644; RV32IA-NEXT: call __atomic_fetch_sub_8 24645; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24646; RV32IA-NEXT: addi sp, sp, 16 24647; RV32IA-NEXT: ret 24648; 24649; RV64I-LABEL: atomicrmw_sub_i64_release: 24650; RV64I: # %bb.0: 24651; RV64I-NEXT: addi sp, sp, -16 24652; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24653; RV64I-NEXT: li a2, 3 24654; RV64I-NEXT: call __atomic_fetch_sub_8 24655; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24656; RV64I-NEXT: addi sp, sp, 16 24657; RV64I-NEXT: ret 24658; 24659; RV64IA-WMO-LABEL: atomicrmw_sub_i64_release: 24660; RV64IA-WMO: # %bb.0: 24661; RV64IA-WMO-NEXT: neg a1, a1 24662; RV64IA-WMO-NEXT: amoadd.d.rl a0, a1, (a0) 24663; RV64IA-WMO-NEXT: ret 24664; 24665; RV64IA-TSO-LABEL: atomicrmw_sub_i64_release: 24666; RV64IA-TSO: # %bb.0: 24667; RV64IA-TSO-NEXT: neg a1, a1 24668; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24669; RV64IA-TSO-NEXT: ret 24670 %1 = atomicrmw sub ptr %a, i64 %b release 24671 ret i64 %1 24672} 24673 24674define i64 @atomicrmw_sub_i64_acq_rel(ptr %a, i64 %b) nounwind { 24675; RV32I-LABEL: atomicrmw_sub_i64_acq_rel: 24676; RV32I: # %bb.0: 24677; RV32I-NEXT: addi sp, sp, -16 24678; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24679; RV32I-NEXT: li a3, 4 24680; RV32I-NEXT: call __atomic_fetch_sub_8 24681; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24682; RV32I-NEXT: addi sp, sp, 16 24683; RV32I-NEXT: ret 24684; 24685; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel: 24686; RV32IA: # %bb.0: 24687; RV32IA-NEXT: addi sp, sp, -16 24688; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24689; RV32IA-NEXT: li a3, 4 24690; RV32IA-NEXT: call __atomic_fetch_sub_8 24691; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24692; RV32IA-NEXT: addi sp, sp, 16 24693; RV32IA-NEXT: ret 24694; 24695; RV64I-LABEL: atomicrmw_sub_i64_acq_rel: 24696; RV64I: # %bb.0: 24697; RV64I-NEXT: addi sp, sp, -16 24698; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24699; RV64I-NEXT: li a2, 4 24700; RV64I-NEXT: call __atomic_fetch_sub_8 24701; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24702; RV64I-NEXT: addi sp, sp, 16 24703; RV64I-NEXT: ret 24704; 24705; RV64IA-WMO-LABEL: atomicrmw_sub_i64_acq_rel: 24706; RV64IA-WMO: # %bb.0: 24707; RV64IA-WMO-NEXT: neg a1, a1 24708; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0) 24709; RV64IA-WMO-NEXT: ret 24710; 24711; RV64IA-TSO-LABEL: atomicrmw_sub_i64_acq_rel: 24712; RV64IA-TSO: # %bb.0: 24713; RV64IA-TSO-NEXT: neg a1, a1 24714; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24715; RV64IA-TSO-NEXT: ret 24716 %1 = atomicrmw sub ptr %a, i64 %b acq_rel 24717 ret i64 %1 24718} 24719 24720define i64 @atomicrmw_sub_i64_seq_cst(ptr %a, i64 %b) nounwind { 24721; RV32I-LABEL: atomicrmw_sub_i64_seq_cst: 24722; RV32I: # %bb.0: 24723; RV32I-NEXT: addi sp, sp, -16 24724; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24725; RV32I-NEXT: li a3, 5 24726; RV32I-NEXT: call __atomic_fetch_sub_8 24727; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24728; RV32I-NEXT: addi sp, sp, 16 24729; RV32I-NEXT: ret 24730; 24731; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst: 24732; RV32IA: # %bb.0: 24733; RV32IA-NEXT: addi sp, sp, -16 24734; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24735; RV32IA-NEXT: li a3, 5 24736; RV32IA-NEXT: call __atomic_fetch_sub_8 24737; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24738; RV32IA-NEXT: addi sp, sp, 16 24739; RV32IA-NEXT: ret 24740; 24741; RV64I-LABEL: atomicrmw_sub_i64_seq_cst: 24742; RV64I: # %bb.0: 24743; RV64I-NEXT: addi sp, sp, -16 24744; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24745; RV64I-NEXT: li a2, 5 24746; RV64I-NEXT: call __atomic_fetch_sub_8 24747; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24748; RV64I-NEXT: addi sp, sp, 16 24749; RV64I-NEXT: ret 24750; 24751; RV64IA-WMO-LABEL: atomicrmw_sub_i64_seq_cst: 24752; RV64IA-WMO: # %bb.0: 24753; RV64IA-WMO-NEXT: neg a1, a1 24754; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0) 24755; RV64IA-WMO-NEXT: ret 24756; 24757; RV64IA-TSO-LABEL: atomicrmw_sub_i64_seq_cst: 24758; RV64IA-TSO: # %bb.0: 24759; RV64IA-TSO-NEXT: neg a1, a1 24760; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0) 24761; RV64IA-TSO-NEXT: ret 24762 %1 = atomicrmw sub ptr %a, i64 %b seq_cst 24763 ret i64 %1 24764} 24765 24766define i64 @atomicrmw_and_i64_monotonic(ptr %a, i64 %b) nounwind { 24767; RV32I-LABEL: atomicrmw_and_i64_monotonic: 24768; RV32I: # %bb.0: 24769; RV32I-NEXT: addi sp, sp, -16 24770; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24771; RV32I-NEXT: li a3, 0 24772; RV32I-NEXT: call __atomic_fetch_and_8 24773; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24774; RV32I-NEXT: addi sp, sp, 16 24775; RV32I-NEXT: ret 24776; 24777; RV32IA-LABEL: atomicrmw_and_i64_monotonic: 24778; RV32IA: # %bb.0: 24779; RV32IA-NEXT: addi sp, sp, -16 24780; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24781; RV32IA-NEXT: li a3, 0 24782; RV32IA-NEXT: call __atomic_fetch_and_8 24783; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24784; RV32IA-NEXT: addi sp, sp, 16 24785; RV32IA-NEXT: ret 24786; 24787; RV64I-LABEL: atomicrmw_and_i64_monotonic: 24788; RV64I: # %bb.0: 24789; RV64I-NEXT: addi sp, sp, -16 24790; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24791; RV64I-NEXT: li a2, 0 24792; RV64I-NEXT: call __atomic_fetch_and_8 24793; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24794; RV64I-NEXT: addi sp, sp, 16 24795; RV64I-NEXT: ret 24796; 24797; RV64IA-LABEL: atomicrmw_and_i64_monotonic: 24798; RV64IA: # %bb.0: 24799; RV64IA-NEXT: amoand.d a0, a1, (a0) 24800; RV64IA-NEXT: ret 24801 %1 = atomicrmw and ptr %a, i64 %b monotonic 24802 ret i64 %1 24803} 24804 24805define i64 @atomicrmw_and_i64_acquire(ptr %a, i64 %b) nounwind { 24806; RV32I-LABEL: atomicrmw_and_i64_acquire: 24807; RV32I: # %bb.0: 24808; RV32I-NEXT: addi sp, sp, -16 24809; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24810; RV32I-NEXT: li a3, 2 24811; RV32I-NEXT: call __atomic_fetch_and_8 24812; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24813; RV32I-NEXT: addi sp, sp, 16 24814; RV32I-NEXT: ret 24815; 24816; RV32IA-LABEL: atomicrmw_and_i64_acquire: 24817; RV32IA: # %bb.0: 24818; RV32IA-NEXT: addi sp, sp, -16 24819; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24820; RV32IA-NEXT: li a3, 2 24821; RV32IA-NEXT: call __atomic_fetch_and_8 24822; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24823; RV32IA-NEXT: addi sp, sp, 16 24824; RV32IA-NEXT: ret 24825; 24826; RV64I-LABEL: atomicrmw_and_i64_acquire: 24827; RV64I: # %bb.0: 24828; RV64I-NEXT: addi sp, sp, -16 24829; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24830; RV64I-NEXT: li a2, 2 24831; RV64I-NEXT: call __atomic_fetch_and_8 24832; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24833; RV64I-NEXT: addi sp, sp, 16 24834; RV64I-NEXT: ret 24835; 24836; RV64IA-WMO-LABEL: atomicrmw_and_i64_acquire: 24837; RV64IA-WMO: # %bb.0: 24838; RV64IA-WMO-NEXT: amoand.d.aq a0, a1, (a0) 24839; RV64IA-WMO-NEXT: ret 24840; 24841; RV64IA-TSO-LABEL: atomicrmw_and_i64_acquire: 24842; RV64IA-TSO: # %bb.0: 24843; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0) 24844; RV64IA-TSO-NEXT: ret 24845 %1 = atomicrmw and ptr %a, i64 %b acquire 24846 ret i64 %1 24847} 24848 24849define i64 @atomicrmw_and_i64_release(ptr %a, i64 %b) nounwind { 24850; RV32I-LABEL: atomicrmw_and_i64_release: 24851; RV32I: # %bb.0: 24852; RV32I-NEXT: addi sp, sp, -16 24853; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24854; RV32I-NEXT: li a3, 3 24855; RV32I-NEXT: call __atomic_fetch_and_8 24856; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24857; RV32I-NEXT: addi sp, sp, 16 24858; RV32I-NEXT: ret 24859; 24860; RV32IA-LABEL: atomicrmw_and_i64_release: 24861; RV32IA: # %bb.0: 24862; RV32IA-NEXT: addi sp, sp, -16 24863; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24864; RV32IA-NEXT: li a3, 3 24865; RV32IA-NEXT: call __atomic_fetch_and_8 24866; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24867; RV32IA-NEXT: addi sp, sp, 16 24868; RV32IA-NEXT: ret 24869; 24870; RV64I-LABEL: atomicrmw_and_i64_release: 24871; RV64I: # %bb.0: 24872; RV64I-NEXT: addi sp, sp, -16 24873; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24874; RV64I-NEXT: li a2, 3 24875; RV64I-NEXT: call __atomic_fetch_and_8 24876; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24877; RV64I-NEXT: addi sp, sp, 16 24878; RV64I-NEXT: ret 24879; 24880; RV64IA-WMO-LABEL: atomicrmw_and_i64_release: 24881; RV64IA-WMO: # %bb.0: 24882; RV64IA-WMO-NEXT: amoand.d.rl a0, a1, (a0) 24883; RV64IA-WMO-NEXT: ret 24884; 24885; RV64IA-TSO-LABEL: atomicrmw_and_i64_release: 24886; RV64IA-TSO: # %bb.0: 24887; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0) 24888; RV64IA-TSO-NEXT: ret 24889 %1 = atomicrmw and ptr %a, i64 %b release 24890 ret i64 %1 24891} 24892 24893define i64 @atomicrmw_and_i64_acq_rel(ptr %a, i64 %b) nounwind { 24894; RV32I-LABEL: atomicrmw_and_i64_acq_rel: 24895; RV32I: # %bb.0: 24896; RV32I-NEXT: addi sp, sp, -16 24897; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24898; RV32I-NEXT: li a3, 4 24899; RV32I-NEXT: call __atomic_fetch_and_8 24900; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24901; RV32I-NEXT: addi sp, sp, 16 24902; RV32I-NEXT: ret 24903; 24904; RV32IA-LABEL: atomicrmw_and_i64_acq_rel: 24905; RV32IA: # %bb.0: 24906; RV32IA-NEXT: addi sp, sp, -16 24907; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24908; RV32IA-NEXT: li a3, 4 24909; RV32IA-NEXT: call __atomic_fetch_and_8 24910; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24911; RV32IA-NEXT: addi sp, sp, 16 24912; RV32IA-NEXT: ret 24913; 24914; RV64I-LABEL: atomicrmw_and_i64_acq_rel: 24915; RV64I: # %bb.0: 24916; RV64I-NEXT: addi sp, sp, -16 24917; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24918; RV64I-NEXT: li a2, 4 24919; RV64I-NEXT: call __atomic_fetch_and_8 24920; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24921; RV64I-NEXT: addi sp, sp, 16 24922; RV64I-NEXT: ret 24923; 24924; RV64IA-WMO-LABEL: atomicrmw_and_i64_acq_rel: 24925; RV64IA-WMO: # %bb.0: 24926; RV64IA-WMO-NEXT: amoand.d.aqrl a0, a1, (a0) 24927; RV64IA-WMO-NEXT: ret 24928; 24929; RV64IA-TSO-LABEL: atomicrmw_and_i64_acq_rel: 24930; RV64IA-TSO: # %bb.0: 24931; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0) 24932; RV64IA-TSO-NEXT: ret 24933 %1 = atomicrmw and ptr %a, i64 %b acq_rel 24934 ret i64 %1 24935} 24936 24937define i64 @atomicrmw_and_i64_seq_cst(ptr %a, i64 %b) nounwind { 24938; RV32I-LABEL: atomicrmw_and_i64_seq_cst: 24939; RV32I: # %bb.0: 24940; RV32I-NEXT: addi sp, sp, -16 24941; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24942; RV32I-NEXT: li a3, 5 24943; RV32I-NEXT: call __atomic_fetch_and_8 24944; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24945; RV32I-NEXT: addi sp, sp, 16 24946; RV32I-NEXT: ret 24947; 24948; RV32IA-LABEL: atomicrmw_and_i64_seq_cst: 24949; RV32IA: # %bb.0: 24950; RV32IA-NEXT: addi sp, sp, -16 24951; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24952; RV32IA-NEXT: li a3, 5 24953; RV32IA-NEXT: call __atomic_fetch_and_8 24954; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24955; RV32IA-NEXT: addi sp, sp, 16 24956; RV32IA-NEXT: ret 24957; 24958; RV64I-LABEL: atomicrmw_and_i64_seq_cst: 24959; RV64I: # %bb.0: 24960; RV64I-NEXT: addi sp, sp, -16 24961; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 24962; RV64I-NEXT: li a2, 5 24963; RV64I-NEXT: call __atomic_fetch_and_8 24964; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 24965; RV64I-NEXT: addi sp, sp, 16 24966; RV64I-NEXT: ret 24967; 24968; RV64IA-WMO-LABEL: atomicrmw_and_i64_seq_cst: 24969; RV64IA-WMO: # %bb.0: 24970; RV64IA-WMO-NEXT: amoand.d.aqrl a0, a1, (a0) 24971; RV64IA-WMO-NEXT: ret 24972; 24973; RV64IA-TSO-LABEL: atomicrmw_and_i64_seq_cst: 24974; RV64IA-TSO: # %bb.0: 24975; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0) 24976; RV64IA-TSO-NEXT: ret 24977 %1 = atomicrmw and ptr %a, i64 %b seq_cst 24978 ret i64 %1 24979} 24980 24981define i64 @atomicrmw_nand_i64_monotonic(ptr %a, i64 %b) nounwind { 24982; RV32I-LABEL: atomicrmw_nand_i64_monotonic: 24983; RV32I: # %bb.0: 24984; RV32I-NEXT: addi sp, sp, -16 24985; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24986; RV32I-NEXT: li a3, 0 24987; RV32I-NEXT: call __atomic_fetch_nand_8 24988; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24989; RV32I-NEXT: addi sp, sp, 16 24990; RV32I-NEXT: ret 24991; 24992; RV32IA-LABEL: atomicrmw_nand_i64_monotonic: 24993; RV32IA: # %bb.0: 24994; RV32IA-NEXT: addi sp, sp, -16 24995; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24996; RV32IA-NEXT: li a3, 0 24997; RV32IA-NEXT: call __atomic_fetch_nand_8 24998; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 24999; RV32IA-NEXT: addi sp, sp, 16 25000; RV32IA-NEXT: ret 25001; 25002; RV64I-LABEL: atomicrmw_nand_i64_monotonic: 25003; RV64I: # %bb.0: 25004; RV64I-NEXT: addi sp, sp, -16 25005; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25006; RV64I-NEXT: li a2, 0 25007; RV64I-NEXT: call __atomic_fetch_nand_8 25008; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25009; RV64I-NEXT: addi sp, sp, 16 25010; RV64I-NEXT: ret 25011; 25012; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic: 25013; RV64IA-NOZACAS: # %bb.0: 25014; RV64IA-NOZACAS-NEXT: .LBB205_1: # =>This Inner Loop Header: Depth=1 25015; RV64IA-NOZACAS-NEXT: lr.d a2, (a0) 25016; RV64IA-NOZACAS-NEXT: and a3, a2, a1 25017; RV64IA-NOZACAS-NEXT: not a3, a3 25018; RV64IA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25019; RV64IA-NOZACAS-NEXT: bnez a3, .LBB205_1 25020; RV64IA-NOZACAS-NEXT: # %bb.2: 25021; RV64IA-NOZACAS-NEXT: mv a0, a2 25022; RV64IA-NOZACAS-NEXT: ret 25023; 25024; RV64IA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic: 25025; RV64IA-ZACAS: # %bb.0: 25026; RV64IA-ZACAS-NEXT: mv a2, a0 25027; RV64IA-ZACAS-NEXT: ld a0, 0(a0) 25028; RV64IA-ZACAS-NEXT: .LBB205_1: # %atomicrmw.start 25029; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25030; RV64IA-ZACAS-NEXT: mv a3, a0 25031; RV64IA-ZACAS-NEXT: and a4, a0, a1 25032; RV64IA-ZACAS-NEXT: not a4, a4 25033; RV64IA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25034; RV64IA-ZACAS-NEXT: bne a0, a3, .LBB205_1 25035; RV64IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25036; RV64IA-ZACAS-NEXT: ret 25037; 25038; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic: 25039; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 25040; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB205_1: # =>This Inner Loop Header: Depth=1 25041; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0) 25042; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25043; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 25044; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25045; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB205_1 25046; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 25047; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 25048; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 25049; 25050; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic: 25051; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 25052; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB205_1: # =>This Inner Loop Header: Depth=1 25053; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0) 25054; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25055; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 25056; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25057; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB205_1 25058; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 25059; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 25060; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 25061; 25062; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic: 25063; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 25064; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 25065; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25066; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB205_1: # %atomicrmw.start 25067; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25068; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 25069; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25070; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 25071; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25072; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB205_1 25073; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25074; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 25075; 25076; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic: 25077; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 25078; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 25079; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25080; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB205_1: # %atomicrmw.start 25081; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25082; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 25083; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25084; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 25085; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25086; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB205_1 25087; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25088; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 25089 %1 = atomicrmw nand ptr %a, i64 %b monotonic 25090 ret i64 %1 25091} 25092 25093define i64 @atomicrmw_nand_i64_acquire(ptr %a, i64 %b) nounwind { 25094; RV32I-LABEL: atomicrmw_nand_i64_acquire: 25095; RV32I: # %bb.0: 25096; RV32I-NEXT: addi sp, sp, -16 25097; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25098; RV32I-NEXT: li a3, 2 25099; RV32I-NEXT: call __atomic_fetch_nand_8 25100; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25101; RV32I-NEXT: addi sp, sp, 16 25102; RV32I-NEXT: ret 25103; 25104; RV32IA-LABEL: atomicrmw_nand_i64_acquire: 25105; RV32IA: # %bb.0: 25106; RV32IA-NEXT: addi sp, sp, -16 25107; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25108; RV32IA-NEXT: li a3, 2 25109; RV32IA-NEXT: call __atomic_fetch_nand_8 25110; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25111; RV32IA-NEXT: addi sp, sp, 16 25112; RV32IA-NEXT: ret 25113; 25114; RV64I-LABEL: atomicrmw_nand_i64_acquire: 25115; RV64I: # %bb.0: 25116; RV64I-NEXT: addi sp, sp, -16 25117; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25118; RV64I-NEXT: li a2, 2 25119; RV64I-NEXT: call __atomic_fetch_nand_8 25120; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25121; RV64I-NEXT: addi sp, sp, 16 25122; RV64I-NEXT: ret 25123; 25124; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_acquire: 25125; RV64IA-WMO-NOZACAS: # %bb.0: 25126; RV64IA-WMO-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1 25127; RV64IA-WMO-NOZACAS-NEXT: lr.d.aq a2, (a0) 25128; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1 25129; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 25130; RV64IA-WMO-NOZACAS-NEXT: sc.d a3, a3, (a0) 25131; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB206_1 25132; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 25133; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2 25134; RV64IA-WMO-NOZACAS-NEXT: ret 25135; 25136; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_acquire: 25137; RV64IA-TSO-NOZACAS: # %bb.0: 25138; RV64IA-TSO-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1 25139; RV64IA-TSO-NOZACAS-NEXT: lr.d a2, (a0) 25140; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1 25141; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 25142; RV64IA-TSO-NOZACAS-NEXT: sc.d a3, a3, (a0) 25143; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB206_1 25144; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 25145; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2 25146; RV64IA-TSO-NOZACAS-NEXT: ret 25147; 25148; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_acquire: 25149; RV64IA-WMO-ZACAS: # %bb.0: 25150; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 25151; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0) 25152; RV64IA-WMO-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start 25153; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25154; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 25155; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 25156; RV64IA-WMO-ZACAS-NEXT: not a4, a4 25157; RV64IA-WMO-ZACAS-NEXT: amocas.d.aq a0, a4, (a2) 25158; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB206_1 25159; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25160; RV64IA-WMO-ZACAS-NEXT: ret 25161; 25162; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_acquire: 25163; RV64IA-TSO-ZACAS: # %bb.0: 25164; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 25165; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0) 25166; RV64IA-TSO-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start 25167; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25168; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 25169; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 25170; RV64IA-TSO-ZACAS-NEXT: not a4, a4 25171; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2) 25172; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB206_1 25173; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25174; RV64IA-TSO-ZACAS-NEXT: ret 25175; 25176; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acquire: 25177; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 25178; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1 25179; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d.aq a2, (a0) 25180; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25181; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 25182; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25183; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB206_1 25184; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 25185; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 25186; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 25187; 25188; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acquire: 25189; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 25190; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1 25191; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0) 25192; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25193; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 25194; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25195; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB206_1 25196; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 25197; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 25198; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 25199; 25200; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acquire: 25201; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 25202; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 25203; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25204; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start 25205; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25206; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 25207; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25208; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 25209; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aq a0, a4, (a2) 25210; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB206_1 25211; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25212; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 25213; 25214; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acquire: 25215; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 25216; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 25217; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25218; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start 25219; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25220; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 25221; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25222; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 25223; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25224; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB206_1 25225; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25226; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 25227 %1 = atomicrmw nand ptr %a, i64 %b acquire 25228 ret i64 %1 25229} 25230 25231define i64 @atomicrmw_nand_i64_release(ptr %a, i64 %b) nounwind { 25232; RV32I-LABEL: atomicrmw_nand_i64_release: 25233; RV32I: # %bb.0: 25234; RV32I-NEXT: addi sp, sp, -16 25235; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25236; RV32I-NEXT: li a3, 3 25237; RV32I-NEXT: call __atomic_fetch_nand_8 25238; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25239; RV32I-NEXT: addi sp, sp, 16 25240; RV32I-NEXT: ret 25241; 25242; RV32IA-LABEL: atomicrmw_nand_i64_release: 25243; RV32IA: # %bb.0: 25244; RV32IA-NEXT: addi sp, sp, -16 25245; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25246; RV32IA-NEXT: li a3, 3 25247; RV32IA-NEXT: call __atomic_fetch_nand_8 25248; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25249; RV32IA-NEXT: addi sp, sp, 16 25250; RV32IA-NEXT: ret 25251; 25252; RV64I-LABEL: atomicrmw_nand_i64_release: 25253; RV64I: # %bb.0: 25254; RV64I-NEXT: addi sp, sp, -16 25255; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25256; RV64I-NEXT: li a2, 3 25257; RV64I-NEXT: call __atomic_fetch_nand_8 25258; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25259; RV64I-NEXT: addi sp, sp, 16 25260; RV64I-NEXT: ret 25261; 25262; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_release: 25263; RV64IA-WMO-NOZACAS: # %bb.0: 25264; RV64IA-WMO-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1 25265; RV64IA-WMO-NOZACAS-NEXT: lr.d a2, (a0) 25266; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1 25267; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 25268; RV64IA-WMO-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25269; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB207_1 25270; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 25271; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2 25272; RV64IA-WMO-NOZACAS-NEXT: ret 25273; 25274; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_release: 25275; RV64IA-TSO-NOZACAS: # %bb.0: 25276; RV64IA-TSO-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1 25277; RV64IA-TSO-NOZACAS-NEXT: lr.d a2, (a0) 25278; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1 25279; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 25280; RV64IA-TSO-NOZACAS-NEXT: sc.d a3, a3, (a0) 25281; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB207_1 25282; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 25283; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2 25284; RV64IA-TSO-NOZACAS-NEXT: ret 25285; 25286; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_release: 25287; RV64IA-WMO-ZACAS: # %bb.0: 25288; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 25289; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0) 25290; RV64IA-WMO-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start 25291; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25292; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 25293; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 25294; RV64IA-WMO-ZACAS-NEXT: not a4, a4 25295; RV64IA-WMO-ZACAS-NEXT: amocas.d.rl a0, a4, (a2) 25296; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB207_1 25297; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25298; RV64IA-WMO-ZACAS-NEXT: ret 25299; 25300; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_release: 25301; RV64IA-TSO-ZACAS: # %bb.0: 25302; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 25303; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0) 25304; RV64IA-TSO-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start 25305; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25306; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 25307; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 25308; RV64IA-TSO-ZACAS-NEXT: not a4, a4 25309; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2) 25310; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB207_1 25311; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25312; RV64IA-TSO-ZACAS-NEXT: ret 25313; 25314; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_release: 25315; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 25316; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1 25317; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0) 25318; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25319; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 25320; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25321; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB207_1 25322; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 25323; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 25324; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 25325; 25326; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_release: 25327; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 25328; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1 25329; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0) 25330; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25331; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 25332; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25333; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB207_1 25334; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 25335; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 25336; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 25337; 25338; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_release: 25339; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 25340; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 25341; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25342; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start 25343; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25344; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 25345; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25346; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 25347; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.rl a0, a4, (a2) 25348; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB207_1 25349; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25350; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 25351; 25352; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_release: 25353; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 25354; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 25355; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25356; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start 25357; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25358; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 25359; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25360; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 25361; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25362; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB207_1 25363; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25364; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 25365 %1 = atomicrmw nand ptr %a, i64 %b release 25366 ret i64 %1 25367} 25368 25369define i64 @atomicrmw_nand_i64_acq_rel(ptr %a, i64 %b) nounwind { 25370; RV32I-LABEL: atomicrmw_nand_i64_acq_rel: 25371; RV32I: # %bb.0: 25372; RV32I-NEXT: addi sp, sp, -16 25373; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25374; RV32I-NEXT: li a3, 4 25375; RV32I-NEXT: call __atomic_fetch_nand_8 25376; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25377; RV32I-NEXT: addi sp, sp, 16 25378; RV32I-NEXT: ret 25379; 25380; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel: 25381; RV32IA: # %bb.0: 25382; RV32IA-NEXT: addi sp, sp, -16 25383; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25384; RV32IA-NEXT: li a3, 4 25385; RV32IA-NEXT: call __atomic_fetch_nand_8 25386; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25387; RV32IA-NEXT: addi sp, sp, 16 25388; RV32IA-NEXT: ret 25389; 25390; RV64I-LABEL: atomicrmw_nand_i64_acq_rel: 25391; RV64I: # %bb.0: 25392; RV64I-NEXT: addi sp, sp, -16 25393; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25394; RV64I-NEXT: li a2, 4 25395; RV64I-NEXT: call __atomic_fetch_nand_8 25396; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25397; RV64I-NEXT: addi sp, sp, 16 25398; RV64I-NEXT: ret 25399; 25400; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25401; RV64IA-WMO-NOZACAS: # %bb.0: 25402; RV64IA-WMO-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1 25403; RV64IA-WMO-NOZACAS-NEXT: lr.d.aq a2, (a0) 25404; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1 25405; RV64IA-WMO-NOZACAS-NEXT: not a3, a3 25406; RV64IA-WMO-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25407; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB208_1 25408; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: 25409; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2 25410; RV64IA-WMO-NOZACAS-NEXT: ret 25411; 25412; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25413; RV64IA-TSO-NOZACAS: # %bb.0: 25414; RV64IA-TSO-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1 25415; RV64IA-TSO-NOZACAS-NEXT: lr.d a2, (a0) 25416; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1 25417; RV64IA-TSO-NOZACAS-NEXT: not a3, a3 25418; RV64IA-TSO-NOZACAS-NEXT: sc.d a3, a3, (a0) 25419; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB208_1 25420; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: 25421; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2 25422; RV64IA-TSO-NOZACAS-NEXT: ret 25423; 25424; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25425; RV64IA-WMO-ZACAS: # %bb.0: 25426; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 25427; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0) 25428; RV64IA-WMO-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start 25429; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25430; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 25431; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 25432; RV64IA-WMO-ZACAS-NEXT: not a4, a4 25433; RV64IA-WMO-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2) 25434; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB208_1 25435; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25436; RV64IA-WMO-ZACAS-NEXT: ret 25437; 25438; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25439; RV64IA-TSO-ZACAS: # %bb.0: 25440; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 25441; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0) 25442; RV64IA-TSO-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start 25443; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25444; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 25445; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 25446; RV64IA-TSO-ZACAS-NEXT: not a4, a4 25447; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2) 25448; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB208_1 25449; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25450; RV64IA-TSO-ZACAS-NEXT: ret 25451; 25452; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25453; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 25454; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1 25455; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d.aq a2, (a0) 25456; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25457; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 25458; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25459; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB208_1 25460; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 25461; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 25462; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 25463; 25464; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25465; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 25466; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1 25467; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0) 25468; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25469; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 25470; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0) 25471; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB208_1 25472; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 25473; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 25474; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 25475; 25476; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25477; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 25478; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 25479; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25480; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start 25481; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25482; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 25483; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25484; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 25485; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2) 25486; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB208_1 25487; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25488; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 25489; 25490; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel: 25491; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 25492; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 25493; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25494; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start 25495; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25496; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 25497; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25498; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 25499; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25500; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB208_1 25501; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25502; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 25503 %1 = atomicrmw nand ptr %a, i64 %b acq_rel 25504 ret i64 %1 25505} 25506 25507define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind { 25508; RV32I-LABEL: atomicrmw_nand_i64_seq_cst: 25509; RV32I: # %bb.0: 25510; RV32I-NEXT: addi sp, sp, -16 25511; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25512; RV32I-NEXT: li a3, 5 25513; RV32I-NEXT: call __atomic_fetch_nand_8 25514; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25515; RV32I-NEXT: addi sp, sp, 16 25516; RV32I-NEXT: ret 25517; 25518; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst: 25519; RV32IA: # %bb.0: 25520; RV32IA-NEXT: addi sp, sp, -16 25521; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25522; RV32IA-NEXT: li a3, 5 25523; RV32IA-NEXT: call __atomic_fetch_nand_8 25524; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25525; RV32IA-NEXT: addi sp, sp, 16 25526; RV32IA-NEXT: ret 25527; 25528; RV64I-LABEL: atomicrmw_nand_i64_seq_cst: 25529; RV64I: # %bb.0: 25530; RV64I-NEXT: addi sp, sp, -16 25531; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25532; RV64I-NEXT: li a2, 5 25533; RV64I-NEXT: call __atomic_fetch_nand_8 25534; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25535; RV64I-NEXT: addi sp, sp, 16 25536; RV64I-NEXT: ret 25537; 25538; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25539; RV64IA-NOZACAS: # %bb.0: 25540; RV64IA-NOZACAS-NEXT: .LBB209_1: # =>This Inner Loop Header: Depth=1 25541; RV64IA-NOZACAS-NEXT: lr.d.aqrl a2, (a0) 25542; RV64IA-NOZACAS-NEXT: and a3, a2, a1 25543; RV64IA-NOZACAS-NEXT: not a3, a3 25544; RV64IA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25545; RV64IA-NOZACAS-NEXT: bnez a3, .LBB209_1 25546; RV64IA-NOZACAS-NEXT: # %bb.2: 25547; RV64IA-NOZACAS-NEXT: mv a0, a2 25548; RV64IA-NOZACAS-NEXT: ret 25549; 25550; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25551; RV64IA-WMO-ZACAS: # %bb.0: 25552; RV64IA-WMO-ZACAS-NEXT: mv a2, a0 25553; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0) 25554; RV64IA-WMO-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start 25555; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25556; RV64IA-WMO-ZACAS-NEXT: mv a3, a0 25557; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1 25558; RV64IA-WMO-ZACAS-NEXT: not a4, a4 25559; RV64IA-WMO-ZACAS-NEXT: fence rw, rw 25560; RV64IA-WMO-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2) 25561; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB209_1 25562; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25563; RV64IA-WMO-ZACAS-NEXT: ret 25564; 25565; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25566; RV64IA-TSO-ZACAS: # %bb.0: 25567; RV64IA-TSO-ZACAS-NEXT: mv a2, a0 25568; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0) 25569; RV64IA-TSO-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start 25570; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25571; RV64IA-TSO-ZACAS-NEXT: mv a3, a0 25572; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1 25573; RV64IA-TSO-ZACAS-NEXT: not a4, a4 25574; RV64IA-TSO-ZACAS-NEXT: fence rw, rw 25575; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2) 25576; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB209_1 25577; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25578; RV64IA-TSO-ZACAS-NEXT: ret 25579; 25580; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25581; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0: 25582; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB209_1: # =>This Inner Loop Header: Depth=1 25583; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d.aqrl a2, (a0) 25584; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25585; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3 25586; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25587; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB209_1 25588; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2: 25589; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2 25590; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret 25591; 25592; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25593; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0: 25594; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB209_1: # =>This Inner Loop Header: Depth=1 25595; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d.aqrl a2, (a0) 25596; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1 25597; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3 25598; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0) 25599; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB209_1 25600; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2: 25601; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2 25602; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret 25603; 25604; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25605; RV64IA-WMO-ZABHA-ZACAS: # %bb.0: 25606; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0 25607; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25608; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start 25609; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25610; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0 25611; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25612; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4 25613; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw 25614; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2) 25615; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB209_1 25616; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25617; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret 25618; 25619; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst: 25620; RV64IA-TSO-ZABHA-ZACAS: # %bb.0: 25621; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0 25622; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0) 25623; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start 25624; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1 25625; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0 25626; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1 25627; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4 25628; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw 25629; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2) 25630; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB209_1 25631; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end 25632; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret 25633 %1 = atomicrmw nand ptr %a, i64 %b seq_cst 25634 ret i64 %1 25635} 25636 25637define i64 @atomicrmw_or_i64_monotonic(ptr %a, i64 %b) nounwind { 25638; RV32I-LABEL: atomicrmw_or_i64_monotonic: 25639; RV32I: # %bb.0: 25640; RV32I-NEXT: addi sp, sp, -16 25641; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25642; RV32I-NEXT: li a3, 0 25643; RV32I-NEXT: call __atomic_fetch_or_8 25644; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25645; RV32I-NEXT: addi sp, sp, 16 25646; RV32I-NEXT: ret 25647; 25648; RV32IA-LABEL: atomicrmw_or_i64_monotonic: 25649; RV32IA: # %bb.0: 25650; RV32IA-NEXT: addi sp, sp, -16 25651; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25652; RV32IA-NEXT: li a3, 0 25653; RV32IA-NEXT: call __atomic_fetch_or_8 25654; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25655; RV32IA-NEXT: addi sp, sp, 16 25656; RV32IA-NEXT: ret 25657; 25658; RV64I-LABEL: atomicrmw_or_i64_monotonic: 25659; RV64I: # %bb.0: 25660; RV64I-NEXT: addi sp, sp, -16 25661; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25662; RV64I-NEXT: li a2, 0 25663; RV64I-NEXT: call __atomic_fetch_or_8 25664; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25665; RV64I-NEXT: addi sp, sp, 16 25666; RV64I-NEXT: ret 25667; 25668; RV64IA-LABEL: atomicrmw_or_i64_monotonic: 25669; RV64IA: # %bb.0: 25670; RV64IA-NEXT: amoor.d a0, a1, (a0) 25671; RV64IA-NEXT: ret 25672 %1 = atomicrmw or ptr %a, i64 %b monotonic 25673 ret i64 %1 25674} 25675 25676define i64 @atomicrmw_or_i64_acquire(ptr %a, i64 %b) nounwind { 25677; RV32I-LABEL: atomicrmw_or_i64_acquire: 25678; RV32I: # %bb.0: 25679; RV32I-NEXT: addi sp, sp, -16 25680; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25681; RV32I-NEXT: li a3, 2 25682; RV32I-NEXT: call __atomic_fetch_or_8 25683; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25684; RV32I-NEXT: addi sp, sp, 16 25685; RV32I-NEXT: ret 25686; 25687; RV32IA-LABEL: atomicrmw_or_i64_acquire: 25688; RV32IA: # %bb.0: 25689; RV32IA-NEXT: addi sp, sp, -16 25690; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25691; RV32IA-NEXT: li a3, 2 25692; RV32IA-NEXT: call __atomic_fetch_or_8 25693; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25694; RV32IA-NEXT: addi sp, sp, 16 25695; RV32IA-NEXT: ret 25696; 25697; RV64I-LABEL: atomicrmw_or_i64_acquire: 25698; RV64I: # %bb.0: 25699; RV64I-NEXT: addi sp, sp, -16 25700; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25701; RV64I-NEXT: li a2, 2 25702; RV64I-NEXT: call __atomic_fetch_or_8 25703; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25704; RV64I-NEXT: addi sp, sp, 16 25705; RV64I-NEXT: ret 25706; 25707; RV64IA-WMO-LABEL: atomicrmw_or_i64_acquire: 25708; RV64IA-WMO: # %bb.0: 25709; RV64IA-WMO-NEXT: amoor.d.aq a0, a1, (a0) 25710; RV64IA-WMO-NEXT: ret 25711; 25712; RV64IA-TSO-LABEL: atomicrmw_or_i64_acquire: 25713; RV64IA-TSO: # %bb.0: 25714; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0) 25715; RV64IA-TSO-NEXT: ret 25716 %1 = atomicrmw or ptr %a, i64 %b acquire 25717 ret i64 %1 25718} 25719 25720define i64 @atomicrmw_or_i64_release(ptr %a, i64 %b) nounwind { 25721; RV32I-LABEL: atomicrmw_or_i64_release: 25722; RV32I: # %bb.0: 25723; RV32I-NEXT: addi sp, sp, -16 25724; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25725; RV32I-NEXT: li a3, 3 25726; RV32I-NEXT: call __atomic_fetch_or_8 25727; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25728; RV32I-NEXT: addi sp, sp, 16 25729; RV32I-NEXT: ret 25730; 25731; RV32IA-LABEL: atomicrmw_or_i64_release: 25732; RV32IA: # %bb.0: 25733; RV32IA-NEXT: addi sp, sp, -16 25734; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25735; RV32IA-NEXT: li a3, 3 25736; RV32IA-NEXT: call __atomic_fetch_or_8 25737; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25738; RV32IA-NEXT: addi sp, sp, 16 25739; RV32IA-NEXT: ret 25740; 25741; RV64I-LABEL: atomicrmw_or_i64_release: 25742; RV64I: # %bb.0: 25743; RV64I-NEXT: addi sp, sp, -16 25744; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25745; RV64I-NEXT: li a2, 3 25746; RV64I-NEXT: call __atomic_fetch_or_8 25747; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25748; RV64I-NEXT: addi sp, sp, 16 25749; RV64I-NEXT: ret 25750; 25751; RV64IA-WMO-LABEL: atomicrmw_or_i64_release: 25752; RV64IA-WMO: # %bb.0: 25753; RV64IA-WMO-NEXT: amoor.d.rl a0, a1, (a0) 25754; RV64IA-WMO-NEXT: ret 25755; 25756; RV64IA-TSO-LABEL: atomicrmw_or_i64_release: 25757; RV64IA-TSO: # %bb.0: 25758; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0) 25759; RV64IA-TSO-NEXT: ret 25760 %1 = atomicrmw or ptr %a, i64 %b release 25761 ret i64 %1 25762} 25763 25764define i64 @atomicrmw_or_i64_acq_rel(ptr %a, i64 %b) nounwind { 25765; RV32I-LABEL: atomicrmw_or_i64_acq_rel: 25766; RV32I: # %bb.0: 25767; RV32I-NEXT: addi sp, sp, -16 25768; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25769; RV32I-NEXT: li a3, 4 25770; RV32I-NEXT: call __atomic_fetch_or_8 25771; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25772; RV32I-NEXT: addi sp, sp, 16 25773; RV32I-NEXT: ret 25774; 25775; RV32IA-LABEL: atomicrmw_or_i64_acq_rel: 25776; RV32IA: # %bb.0: 25777; RV32IA-NEXT: addi sp, sp, -16 25778; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25779; RV32IA-NEXT: li a3, 4 25780; RV32IA-NEXT: call __atomic_fetch_or_8 25781; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25782; RV32IA-NEXT: addi sp, sp, 16 25783; RV32IA-NEXT: ret 25784; 25785; RV64I-LABEL: atomicrmw_or_i64_acq_rel: 25786; RV64I: # %bb.0: 25787; RV64I-NEXT: addi sp, sp, -16 25788; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25789; RV64I-NEXT: li a2, 4 25790; RV64I-NEXT: call __atomic_fetch_or_8 25791; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25792; RV64I-NEXT: addi sp, sp, 16 25793; RV64I-NEXT: ret 25794; 25795; RV64IA-WMO-LABEL: atomicrmw_or_i64_acq_rel: 25796; RV64IA-WMO: # %bb.0: 25797; RV64IA-WMO-NEXT: amoor.d.aqrl a0, a1, (a0) 25798; RV64IA-WMO-NEXT: ret 25799; 25800; RV64IA-TSO-LABEL: atomicrmw_or_i64_acq_rel: 25801; RV64IA-TSO: # %bb.0: 25802; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0) 25803; RV64IA-TSO-NEXT: ret 25804 %1 = atomicrmw or ptr %a, i64 %b acq_rel 25805 ret i64 %1 25806} 25807 25808define i64 @atomicrmw_or_i64_seq_cst(ptr %a, i64 %b) nounwind { 25809; RV32I-LABEL: atomicrmw_or_i64_seq_cst: 25810; RV32I: # %bb.0: 25811; RV32I-NEXT: addi sp, sp, -16 25812; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25813; RV32I-NEXT: li a3, 5 25814; RV32I-NEXT: call __atomic_fetch_or_8 25815; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25816; RV32I-NEXT: addi sp, sp, 16 25817; RV32I-NEXT: ret 25818; 25819; RV32IA-LABEL: atomicrmw_or_i64_seq_cst: 25820; RV32IA: # %bb.0: 25821; RV32IA-NEXT: addi sp, sp, -16 25822; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25823; RV32IA-NEXT: li a3, 5 25824; RV32IA-NEXT: call __atomic_fetch_or_8 25825; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25826; RV32IA-NEXT: addi sp, sp, 16 25827; RV32IA-NEXT: ret 25828; 25829; RV64I-LABEL: atomicrmw_or_i64_seq_cst: 25830; RV64I: # %bb.0: 25831; RV64I-NEXT: addi sp, sp, -16 25832; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25833; RV64I-NEXT: li a2, 5 25834; RV64I-NEXT: call __atomic_fetch_or_8 25835; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25836; RV64I-NEXT: addi sp, sp, 16 25837; RV64I-NEXT: ret 25838; 25839; RV64IA-WMO-LABEL: atomicrmw_or_i64_seq_cst: 25840; RV64IA-WMO: # %bb.0: 25841; RV64IA-WMO-NEXT: amoor.d.aqrl a0, a1, (a0) 25842; RV64IA-WMO-NEXT: ret 25843; 25844; RV64IA-TSO-LABEL: atomicrmw_or_i64_seq_cst: 25845; RV64IA-TSO: # %bb.0: 25846; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0) 25847; RV64IA-TSO-NEXT: ret 25848 %1 = atomicrmw or ptr %a, i64 %b seq_cst 25849 ret i64 %1 25850} 25851 25852define i64 @atomicrmw_xor_i64_monotonic(ptr %a, i64 %b) nounwind { 25853; RV32I-LABEL: atomicrmw_xor_i64_monotonic: 25854; RV32I: # %bb.0: 25855; RV32I-NEXT: addi sp, sp, -16 25856; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25857; RV32I-NEXT: li a3, 0 25858; RV32I-NEXT: call __atomic_fetch_xor_8 25859; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25860; RV32I-NEXT: addi sp, sp, 16 25861; RV32I-NEXT: ret 25862; 25863; RV32IA-LABEL: atomicrmw_xor_i64_monotonic: 25864; RV32IA: # %bb.0: 25865; RV32IA-NEXT: addi sp, sp, -16 25866; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25867; RV32IA-NEXT: li a3, 0 25868; RV32IA-NEXT: call __atomic_fetch_xor_8 25869; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25870; RV32IA-NEXT: addi sp, sp, 16 25871; RV32IA-NEXT: ret 25872; 25873; RV64I-LABEL: atomicrmw_xor_i64_monotonic: 25874; RV64I: # %bb.0: 25875; RV64I-NEXT: addi sp, sp, -16 25876; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25877; RV64I-NEXT: li a2, 0 25878; RV64I-NEXT: call __atomic_fetch_xor_8 25879; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25880; RV64I-NEXT: addi sp, sp, 16 25881; RV64I-NEXT: ret 25882; 25883; RV64IA-LABEL: atomicrmw_xor_i64_monotonic: 25884; RV64IA: # %bb.0: 25885; RV64IA-NEXT: amoxor.d a0, a1, (a0) 25886; RV64IA-NEXT: ret 25887 %1 = atomicrmw xor ptr %a, i64 %b monotonic 25888 ret i64 %1 25889} 25890 25891define i64 @atomicrmw_xor_i64_acquire(ptr %a, i64 %b) nounwind { 25892; RV32I-LABEL: atomicrmw_xor_i64_acquire: 25893; RV32I: # %bb.0: 25894; RV32I-NEXT: addi sp, sp, -16 25895; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25896; RV32I-NEXT: li a3, 2 25897; RV32I-NEXT: call __atomic_fetch_xor_8 25898; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25899; RV32I-NEXT: addi sp, sp, 16 25900; RV32I-NEXT: ret 25901; 25902; RV32IA-LABEL: atomicrmw_xor_i64_acquire: 25903; RV32IA: # %bb.0: 25904; RV32IA-NEXT: addi sp, sp, -16 25905; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25906; RV32IA-NEXT: li a3, 2 25907; RV32IA-NEXT: call __atomic_fetch_xor_8 25908; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25909; RV32IA-NEXT: addi sp, sp, 16 25910; RV32IA-NEXT: ret 25911; 25912; RV64I-LABEL: atomicrmw_xor_i64_acquire: 25913; RV64I: # %bb.0: 25914; RV64I-NEXT: addi sp, sp, -16 25915; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25916; RV64I-NEXT: li a2, 2 25917; RV64I-NEXT: call __atomic_fetch_xor_8 25918; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25919; RV64I-NEXT: addi sp, sp, 16 25920; RV64I-NEXT: ret 25921; 25922; RV64IA-WMO-LABEL: atomicrmw_xor_i64_acquire: 25923; RV64IA-WMO: # %bb.0: 25924; RV64IA-WMO-NEXT: amoxor.d.aq a0, a1, (a0) 25925; RV64IA-WMO-NEXT: ret 25926; 25927; RV64IA-TSO-LABEL: atomicrmw_xor_i64_acquire: 25928; RV64IA-TSO: # %bb.0: 25929; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0) 25930; RV64IA-TSO-NEXT: ret 25931 %1 = atomicrmw xor ptr %a, i64 %b acquire 25932 ret i64 %1 25933} 25934 25935define i64 @atomicrmw_xor_i64_release(ptr %a, i64 %b) nounwind { 25936; RV32I-LABEL: atomicrmw_xor_i64_release: 25937; RV32I: # %bb.0: 25938; RV32I-NEXT: addi sp, sp, -16 25939; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25940; RV32I-NEXT: li a3, 3 25941; RV32I-NEXT: call __atomic_fetch_xor_8 25942; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25943; RV32I-NEXT: addi sp, sp, 16 25944; RV32I-NEXT: ret 25945; 25946; RV32IA-LABEL: atomicrmw_xor_i64_release: 25947; RV32IA: # %bb.0: 25948; RV32IA-NEXT: addi sp, sp, -16 25949; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25950; RV32IA-NEXT: li a3, 3 25951; RV32IA-NEXT: call __atomic_fetch_xor_8 25952; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25953; RV32IA-NEXT: addi sp, sp, 16 25954; RV32IA-NEXT: ret 25955; 25956; RV64I-LABEL: atomicrmw_xor_i64_release: 25957; RV64I: # %bb.0: 25958; RV64I-NEXT: addi sp, sp, -16 25959; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 25960; RV64I-NEXT: li a2, 3 25961; RV64I-NEXT: call __atomic_fetch_xor_8 25962; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 25963; RV64I-NEXT: addi sp, sp, 16 25964; RV64I-NEXT: ret 25965; 25966; RV64IA-WMO-LABEL: atomicrmw_xor_i64_release: 25967; RV64IA-WMO: # %bb.0: 25968; RV64IA-WMO-NEXT: amoxor.d.rl a0, a1, (a0) 25969; RV64IA-WMO-NEXT: ret 25970; 25971; RV64IA-TSO-LABEL: atomicrmw_xor_i64_release: 25972; RV64IA-TSO: # %bb.0: 25973; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0) 25974; RV64IA-TSO-NEXT: ret 25975 %1 = atomicrmw xor ptr %a, i64 %b release 25976 ret i64 %1 25977} 25978 25979define i64 @atomicrmw_xor_i64_acq_rel(ptr %a, i64 %b) nounwind { 25980; RV32I-LABEL: atomicrmw_xor_i64_acq_rel: 25981; RV32I: # %bb.0: 25982; RV32I-NEXT: addi sp, sp, -16 25983; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25984; RV32I-NEXT: li a3, 4 25985; RV32I-NEXT: call __atomic_fetch_xor_8 25986; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25987; RV32I-NEXT: addi sp, sp, 16 25988; RV32I-NEXT: ret 25989; 25990; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel: 25991; RV32IA: # %bb.0: 25992; RV32IA-NEXT: addi sp, sp, -16 25993; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25994; RV32IA-NEXT: li a3, 4 25995; RV32IA-NEXT: call __atomic_fetch_xor_8 25996; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25997; RV32IA-NEXT: addi sp, sp, 16 25998; RV32IA-NEXT: ret 25999; 26000; RV64I-LABEL: atomicrmw_xor_i64_acq_rel: 26001; RV64I: # %bb.0: 26002; RV64I-NEXT: addi sp, sp, -16 26003; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 26004; RV64I-NEXT: li a2, 4 26005; RV64I-NEXT: call __atomic_fetch_xor_8 26006; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 26007; RV64I-NEXT: addi sp, sp, 16 26008; RV64I-NEXT: ret 26009; 26010; RV64IA-WMO-LABEL: atomicrmw_xor_i64_acq_rel: 26011; RV64IA-WMO: # %bb.0: 26012; RV64IA-WMO-NEXT: amoxor.d.aqrl a0, a1, (a0) 26013; RV64IA-WMO-NEXT: ret 26014; 26015; RV64IA-TSO-LABEL: atomicrmw_xor_i64_acq_rel: 26016; RV64IA-TSO: # %bb.0: 26017; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0) 26018; RV64IA-TSO-NEXT: ret 26019 %1 = atomicrmw xor ptr %a, i64 %b acq_rel 26020 ret i64 %1 26021} 26022 26023define i64 @atomicrmw_xor_i64_seq_cst(ptr %a, i64 %b) nounwind { 26024; RV32I-LABEL: atomicrmw_xor_i64_seq_cst: 26025; RV32I: # %bb.0: 26026; RV32I-NEXT: addi sp, sp, -16 26027; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 26028; RV32I-NEXT: li a3, 5 26029; RV32I-NEXT: call __atomic_fetch_xor_8 26030; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 26031; RV32I-NEXT: addi sp, sp, 16 26032; RV32I-NEXT: ret 26033; 26034; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst: 26035; RV32IA: # %bb.0: 26036; RV32IA-NEXT: addi sp, sp, -16 26037; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 26038; RV32IA-NEXT: li a3, 5 26039; RV32IA-NEXT: call __atomic_fetch_xor_8 26040; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 26041; RV32IA-NEXT: addi sp, sp, 16 26042; RV32IA-NEXT: ret 26043; 26044; RV64I-LABEL: atomicrmw_xor_i64_seq_cst: 26045; RV64I: # %bb.0: 26046; RV64I-NEXT: addi sp, sp, -16 26047; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 26048; RV64I-NEXT: li a2, 5 26049; RV64I-NEXT: call __atomic_fetch_xor_8 26050; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 26051; RV64I-NEXT: addi sp, sp, 16 26052; RV64I-NEXT: ret 26053; 26054; RV64IA-WMO-LABEL: atomicrmw_xor_i64_seq_cst: 26055; RV64IA-WMO: # %bb.0: 26056; RV64IA-WMO-NEXT: amoxor.d.aqrl a0, a1, (a0) 26057; RV64IA-WMO-NEXT: ret 26058; 26059; RV64IA-TSO-LABEL: atomicrmw_xor_i64_seq_cst: 26060; RV64IA-TSO: # %bb.0: 26061; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0) 26062; RV64IA-TSO-NEXT: ret 26063 %1 = atomicrmw xor ptr %a, i64 %b seq_cst 26064 ret i64 %1 26065} 26066 26067define i64 @atomicrmw_max_i64_monotonic(ptr %a, i64 %b) nounwind { 26068; RV32I-LABEL: atomicrmw_max_i64_monotonic: 26069; RV32I: # %bb.0: 26070; RV32I-NEXT: addi sp, sp, -32 26071; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26072; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26073; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26074; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26075; RV32I-NEXT: mv s0, a2 26076; RV32I-NEXT: mv s1, a0 26077; RV32I-NEXT: lw a4, 0(a0) 26078; RV32I-NEXT: lw a5, 4(a0) 26079; RV32I-NEXT: mv s2, a1 26080; RV32I-NEXT: j .LBB220_2 26081; RV32I-NEXT: .LBB220_1: # %atomicrmw.start 26082; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1 26083; RV32I-NEXT: sw a4, 8(sp) 26084; RV32I-NEXT: sw a5, 12(sp) 26085; RV32I-NEXT: addi a1, sp, 8 26086; RV32I-NEXT: mv a0, s1 26087; RV32I-NEXT: li a4, 0 26088; RV32I-NEXT: li a5, 0 26089; RV32I-NEXT: call __atomic_compare_exchange_8 26090; RV32I-NEXT: lw a4, 8(sp) 26091; RV32I-NEXT: lw a5, 12(sp) 26092; RV32I-NEXT: bnez a0, .LBB220_7 26093; RV32I-NEXT: .LBB220_2: # %atomicrmw.start 26094; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 26095; RV32I-NEXT: beq a5, s0, .LBB220_4 26096; RV32I-NEXT: # %bb.3: # %atomicrmw.start 26097; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1 26098; RV32I-NEXT: slt a0, s0, a5 26099; RV32I-NEXT: j .LBB220_5 26100; RV32I-NEXT: .LBB220_4: # in Loop: Header=BB220_2 Depth=1 26101; RV32I-NEXT: sltu a0, s2, a4 26102; RV32I-NEXT: .LBB220_5: # %atomicrmw.start 26103; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1 26104; RV32I-NEXT: mv a2, a4 26105; RV32I-NEXT: mv a3, a5 26106; RV32I-NEXT: bnez a0, .LBB220_1 26107; RV32I-NEXT: # %bb.6: # %atomicrmw.start 26108; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1 26109; RV32I-NEXT: mv a2, s2 26110; RV32I-NEXT: mv a3, s0 26111; RV32I-NEXT: j .LBB220_1 26112; RV32I-NEXT: .LBB220_7: # %atomicrmw.end 26113; RV32I-NEXT: mv a0, a4 26114; RV32I-NEXT: mv a1, a5 26115; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26116; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26117; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26118; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26119; RV32I-NEXT: addi sp, sp, 32 26120; RV32I-NEXT: ret 26121; 26122; RV32IA-LABEL: atomicrmw_max_i64_monotonic: 26123; RV32IA: # %bb.0: 26124; RV32IA-NEXT: addi sp, sp, -32 26125; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26126; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26127; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26128; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26129; RV32IA-NEXT: mv s0, a2 26130; RV32IA-NEXT: mv s1, a0 26131; RV32IA-NEXT: lw a4, 0(a0) 26132; RV32IA-NEXT: lw a5, 4(a0) 26133; RV32IA-NEXT: mv s2, a1 26134; RV32IA-NEXT: j .LBB220_2 26135; RV32IA-NEXT: .LBB220_1: # %atomicrmw.start 26136; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1 26137; RV32IA-NEXT: sw a4, 8(sp) 26138; RV32IA-NEXT: sw a5, 12(sp) 26139; RV32IA-NEXT: addi a1, sp, 8 26140; RV32IA-NEXT: mv a0, s1 26141; RV32IA-NEXT: li a4, 0 26142; RV32IA-NEXT: li a5, 0 26143; RV32IA-NEXT: call __atomic_compare_exchange_8 26144; RV32IA-NEXT: lw a4, 8(sp) 26145; RV32IA-NEXT: lw a5, 12(sp) 26146; RV32IA-NEXT: bnez a0, .LBB220_7 26147; RV32IA-NEXT: .LBB220_2: # %atomicrmw.start 26148; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 26149; RV32IA-NEXT: beq a5, s0, .LBB220_4 26150; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 26151; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1 26152; RV32IA-NEXT: slt a0, s0, a5 26153; RV32IA-NEXT: j .LBB220_5 26154; RV32IA-NEXT: .LBB220_4: # in Loop: Header=BB220_2 Depth=1 26155; RV32IA-NEXT: sltu a0, s2, a4 26156; RV32IA-NEXT: .LBB220_5: # %atomicrmw.start 26157; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1 26158; RV32IA-NEXT: mv a2, a4 26159; RV32IA-NEXT: mv a3, a5 26160; RV32IA-NEXT: bnez a0, .LBB220_1 26161; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 26162; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1 26163; RV32IA-NEXT: mv a2, s2 26164; RV32IA-NEXT: mv a3, s0 26165; RV32IA-NEXT: j .LBB220_1 26166; RV32IA-NEXT: .LBB220_7: # %atomicrmw.end 26167; RV32IA-NEXT: mv a0, a4 26168; RV32IA-NEXT: mv a1, a5 26169; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26170; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26171; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26172; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26173; RV32IA-NEXT: addi sp, sp, 32 26174; RV32IA-NEXT: ret 26175; 26176; RV64I-LABEL: atomicrmw_max_i64_monotonic: 26177; RV64I: # %bb.0: 26178; RV64I-NEXT: addi sp, sp, -32 26179; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 26180; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 26181; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 26182; RV64I-NEXT: mv s0, a0 26183; RV64I-NEXT: ld a3, 0(a0) 26184; RV64I-NEXT: mv s1, a1 26185; RV64I-NEXT: j .LBB220_2 26186; RV64I-NEXT: .LBB220_1: # %atomicrmw.start 26187; RV64I-NEXT: # in Loop: Header=BB220_2 Depth=1 26188; RV64I-NEXT: sd a3, 0(sp) 26189; RV64I-NEXT: mv a1, sp 26190; RV64I-NEXT: mv a0, s0 26191; RV64I-NEXT: li a3, 0 26192; RV64I-NEXT: li a4, 0 26193; RV64I-NEXT: call __atomic_compare_exchange_8 26194; RV64I-NEXT: ld a3, 0(sp) 26195; RV64I-NEXT: bnez a0, .LBB220_4 26196; RV64I-NEXT: .LBB220_2: # %atomicrmw.start 26197; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 26198; RV64I-NEXT: mv a2, a3 26199; RV64I-NEXT: blt s1, a3, .LBB220_1 26200; RV64I-NEXT: # %bb.3: # %atomicrmw.start 26201; RV64I-NEXT: # in Loop: Header=BB220_2 Depth=1 26202; RV64I-NEXT: mv a2, s1 26203; RV64I-NEXT: j .LBB220_1 26204; RV64I-NEXT: .LBB220_4: # %atomicrmw.end 26205; RV64I-NEXT: mv a0, a3 26206; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 26207; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 26208; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 26209; RV64I-NEXT: addi sp, sp, 32 26210; RV64I-NEXT: ret 26211; 26212; RV64IA-LABEL: atomicrmw_max_i64_monotonic: 26213; RV64IA: # %bb.0: 26214; RV64IA-NEXT: amomax.d a0, a1, (a0) 26215; RV64IA-NEXT: ret 26216 %1 = atomicrmw max ptr %a, i64 %b monotonic 26217 ret i64 %1 26218} 26219 26220define i64 @atomicrmw_max_i64_acquire(ptr %a, i64 %b) nounwind { 26221; RV32I-LABEL: atomicrmw_max_i64_acquire: 26222; RV32I: # %bb.0: 26223; RV32I-NEXT: addi sp, sp, -32 26224; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26225; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26226; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26227; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26228; RV32I-NEXT: mv s0, a2 26229; RV32I-NEXT: mv s1, a0 26230; RV32I-NEXT: lw a4, 0(a0) 26231; RV32I-NEXT: lw a5, 4(a0) 26232; RV32I-NEXT: mv s2, a1 26233; RV32I-NEXT: j .LBB221_2 26234; RV32I-NEXT: .LBB221_1: # %atomicrmw.start 26235; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1 26236; RV32I-NEXT: sw a4, 8(sp) 26237; RV32I-NEXT: sw a5, 12(sp) 26238; RV32I-NEXT: addi a1, sp, 8 26239; RV32I-NEXT: li a4, 2 26240; RV32I-NEXT: li a5, 2 26241; RV32I-NEXT: mv a0, s1 26242; RV32I-NEXT: call __atomic_compare_exchange_8 26243; RV32I-NEXT: lw a4, 8(sp) 26244; RV32I-NEXT: lw a5, 12(sp) 26245; RV32I-NEXT: bnez a0, .LBB221_7 26246; RV32I-NEXT: .LBB221_2: # %atomicrmw.start 26247; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 26248; RV32I-NEXT: beq a5, s0, .LBB221_4 26249; RV32I-NEXT: # %bb.3: # %atomicrmw.start 26250; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1 26251; RV32I-NEXT: slt a0, s0, a5 26252; RV32I-NEXT: j .LBB221_5 26253; RV32I-NEXT: .LBB221_4: # in Loop: Header=BB221_2 Depth=1 26254; RV32I-NEXT: sltu a0, s2, a4 26255; RV32I-NEXT: .LBB221_5: # %atomicrmw.start 26256; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1 26257; RV32I-NEXT: mv a2, a4 26258; RV32I-NEXT: mv a3, a5 26259; RV32I-NEXT: bnez a0, .LBB221_1 26260; RV32I-NEXT: # %bb.6: # %atomicrmw.start 26261; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1 26262; RV32I-NEXT: mv a2, s2 26263; RV32I-NEXT: mv a3, s0 26264; RV32I-NEXT: j .LBB221_1 26265; RV32I-NEXT: .LBB221_7: # %atomicrmw.end 26266; RV32I-NEXT: mv a0, a4 26267; RV32I-NEXT: mv a1, a5 26268; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26269; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26270; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26271; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26272; RV32I-NEXT: addi sp, sp, 32 26273; RV32I-NEXT: ret 26274; 26275; RV32IA-LABEL: atomicrmw_max_i64_acquire: 26276; RV32IA: # %bb.0: 26277; RV32IA-NEXT: addi sp, sp, -32 26278; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26279; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26280; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26281; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26282; RV32IA-NEXT: mv s0, a2 26283; RV32IA-NEXT: mv s1, a0 26284; RV32IA-NEXT: lw a4, 0(a0) 26285; RV32IA-NEXT: lw a5, 4(a0) 26286; RV32IA-NEXT: mv s2, a1 26287; RV32IA-NEXT: j .LBB221_2 26288; RV32IA-NEXT: .LBB221_1: # %atomicrmw.start 26289; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1 26290; RV32IA-NEXT: sw a4, 8(sp) 26291; RV32IA-NEXT: sw a5, 12(sp) 26292; RV32IA-NEXT: addi a1, sp, 8 26293; RV32IA-NEXT: li a4, 2 26294; RV32IA-NEXT: li a5, 2 26295; RV32IA-NEXT: mv a0, s1 26296; RV32IA-NEXT: call __atomic_compare_exchange_8 26297; RV32IA-NEXT: lw a4, 8(sp) 26298; RV32IA-NEXT: lw a5, 12(sp) 26299; RV32IA-NEXT: bnez a0, .LBB221_7 26300; RV32IA-NEXT: .LBB221_2: # %atomicrmw.start 26301; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 26302; RV32IA-NEXT: beq a5, s0, .LBB221_4 26303; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 26304; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1 26305; RV32IA-NEXT: slt a0, s0, a5 26306; RV32IA-NEXT: j .LBB221_5 26307; RV32IA-NEXT: .LBB221_4: # in Loop: Header=BB221_2 Depth=1 26308; RV32IA-NEXT: sltu a0, s2, a4 26309; RV32IA-NEXT: .LBB221_5: # %atomicrmw.start 26310; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1 26311; RV32IA-NEXT: mv a2, a4 26312; RV32IA-NEXT: mv a3, a5 26313; RV32IA-NEXT: bnez a0, .LBB221_1 26314; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 26315; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1 26316; RV32IA-NEXT: mv a2, s2 26317; RV32IA-NEXT: mv a3, s0 26318; RV32IA-NEXT: j .LBB221_1 26319; RV32IA-NEXT: .LBB221_7: # %atomicrmw.end 26320; RV32IA-NEXT: mv a0, a4 26321; RV32IA-NEXT: mv a1, a5 26322; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26323; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26324; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26325; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26326; RV32IA-NEXT: addi sp, sp, 32 26327; RV32IA-NEXT: ret 26328; 26329; RV64I-LABEL: atomicrmw_max_i64_acquire: 26330; RV64I: # %bb.0: 26331; RV64I-NEXT: addi sp, sp, -32 26332; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 26333; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 26334; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 26335; RV64I-NEXT: mv s0, a0 26336; RV64I-NEXT: ld a3, 0(a0) 26337; RV64I-NEXT: mv s1, a1 26338; RV64I-NEXT: j .LBB221_2 26339; RV64I-NEXT: .LBB221_1: # %atomicrmw.start 26340; RV64I-NEXT: # in Loop: Header=BB221_2 Depth=1 26341; RV64I-NEXT: sd a3, 0(sp) 26342; RV64I-NEXT: mv a1, sp 26343; RV64I-NEXT: li a3, 2 26344; RV64I-NEXT: li a4, 2 26345; RV64I-NEXT: mv a0, s0 26346; RV64I-NEXT: call __atomic_compare_exchange_8 26347; RV64I-NEXT: ld a3, 0(sp) 26348; RV64I-NEXT: bnez a0, .LBB221_4 26349; RV64I-NEXT: .LBB221_2: # %atomicrmw.start 26350; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 26351; RV64I-NEXT: mv a2, a3 26352; RV64I-NEXT: blt s1, a3, .LBB221_1 26353; RV64I-NEXT: # %bb.3: # %atomicrmw.start 26354; RV64I-NEXT: # in Loop: Header=BB221_2 Depth=1 26355; RV64I-NEXT: mv a2, s1 26356; RV64I-NEXT: j .LBB221_1 26357; RV64I-NEXT: .LBB221_4: # %atomicrmw.end 26358; RV64I-NEXT: mv a0, a3 26359; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 26360; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 26361; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 26362; RV64I-NEXT: addi sp, sp, 32 26363; RV64I-NEXT: ret 26364; 26365; RV64IA-WMO-LABEL: atomicrmw_max_i64_acquire: 26366; RV64IA-WMO: # %bb.0: 26367; RV64IA-WMO-NEXT: amomax.d.aq a0, a1, (a0) 26368; RV64IA-WMO-NEXT: ret 26369; 26370; RV64IA-TSO-LABEL: atomicrmw_max_i64_acquire: 26371; RV64IA-TSO: # %bb.0: 26372; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0) 26373; RV64IA-TSO-NEXT: ret 26374 %1 = atomicrmw max ptr %a, i64 %b acquire 26375 ret i64 %1 26376} 26377 26378define i64 @atomicrmw_max_i64_release(ptr %a, i64 %b) nounwind { 26379; RV32I-LABEL: atomicrmw_max_i64_release: 26380; RV32I: # %bb.0: 26381; RV32I-NEXT: addi sp, sp, -32 26382; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26383; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26384; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26385; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26386; RV32I-NEXT: mv s0, a2 26387; RV32I-NEXT: mv s1, a0 26388; RV32I-NEXT: lw a4, 0(a0) 26389; RV32I-NEXT: lw a5, 4(a0) 26390; RV32I-NEXT: mv s2, a1 26391; RV32I-NEXT: j .LBB222_2 26392; RV32I-NEXT: .LBB222_1: # %atomicrmw.start 26393; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1 26394; RV32I-NEXT: sw a4, 8(sp) 26395; RV32I-NEXT: sw a5, 12(sp) 26396; RV32I-NEXT: addi a1, sp, 8 26397; RV32I-NEXT: li a4, 3 26398; RV32I-NEXT: mv a0, s1 26399; RV32I-NEXT: li a5, 0 26400; RV32I-NEXT: call __atomic_compare_exchange_8 26401; RV32I-NEXT: lw a4, 8(sp) 26402; RV32I-NEXT: lw a5, 12(sp) 26403; RV32I-NEXT: bnez a0, .LBB222_7 26404; RV32I-NEXT: .LBB222_2: # %atomicrmw.start 26405; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 26406; RV32I-NEXT: beq a5, s0, .LBB222_4 26407; RV32I-NEXT: # %bb.3: # %atomicrmw.start 26408; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1 26409; RV32I-NEXT: slt a0, s0, a5 26410; RV32I-NEXT: j .LBB222_5 26411; RV32I-NEXT: .LBB222_4: # in Loop: Header=BB222_2 Depth=1 26412; RV32I-NEXT: sltu a0, s2, a4 26413; RV32I-NEXT: .LBB222_5: # %atomicrmw.start 26414; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1 26415; RV32I-NEXT: mv a2, a4 26416; RV32I-NEXT: mv a3, a5 26417; RV32I-NEXT: bnez a0, .LBB222_1 26418; RV32I-NEXT: # %bb.6: # %atomicrmw.start 26419; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1 26420; RV32I-NEXT: mv a2, s2 26421; RV32I-NEXT: mv a3, s0 26422; RV32I-NEXT: j .LBB222_1 26423; RV32I-NEXT: .LBB222_7: # %atomicrmw.end 26424; RV32I-NEXT: mv a0, a4 26425; RV32I-NEXT: mv a1, a5 26426; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26427; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26428; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26429; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26430; RV32I-NEXT: addi sp, sp, 32 26431; RV32I-NEXT: ret 26432; 26433; RV32IA-LABEL: atomicrmw_max_i64_release: 26434; RV32IA: # %bb.0: 26435; RV32IA-NEXT: addi sp, sp, -32 26436; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26437; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26438; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26439; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26440; RV32IA-NEXT: mv s0, a2 26441; RV32IA-NEXT: mv s1, a0 26442; RV32IA-NEXT: lw a4, 0(a0) 26443; RV32IA-NEXT: lw a5, 4(a0) 26444; RV32IA-NEXT: mv s2, a1 26445; RV32IA-NEXT: j .LBB222_2 26446; RV32IA-NEXT: .LBB222_1: # %atomicrmw.start 26447; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1 26448; RV32IA-NEXT: sw a4, 8(sp) 26449; RV32IA-NEXT: sw a5, 12(sp) 26450; RV32IA-NEXT: addi a1, sp, 8 26451; RV32IA-NEXT: li a4, 3 26452; RV32IA-NEXT: mv a0, s1 26453; RV32IA-NEXT: li a5, 0 26454; RV32IA-NEXT: call __atomic_compare_exchange_8 26455; RV32IA-NEXT: lw a4, 8(sp) 26456; RV32IA-NEXT: lw a5, 12(sp) 26457; RV32IA-NEXT: bnez a0, .LBB222_7 26458; RV32IA-NEXT: .LBB222_2: # %atomicrmw.start 26459; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 26460; RV32IA-NEXT: beq a5, s0, .LBB222_4 26461; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 26462; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1 26463; RV32IA-NEXT: slt a0, s0, a5 26464; RV32IA-NEXT: j .LBB222_5 26465; RV32IA-NEXT: .LBB222_4: # in Loop: Header=BB222_2 Depth=1 26466; RV32IA-NEXT: sltu a0, s2, a4 26467; RV32IA-NEXT: .LBB222_5: # %atomicrmw.start 26468; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1 26469; RV32IA-NEXT: mv a2, a4 26470; RV32IA-NEXT: mv a3, a5 26471; RV32IA-NEXT: bnez a0, .LBB222_1 26472; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 26473; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1 26474; RV32IA-NEXT: mv a2, s2 26475; RV32IA-NEXT: mv a3, s0 26476; RV32IA-NEXT: j .LBB222_1 26477; RV32IA-NEXT: .LBB222_7: # %atomicrmw.end 26478; RV32IA-NEXT: mv a0, a4 26479; RV32IA-NEXT: mv a1, a5 26480; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26481; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26482; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26483; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26484; RV32IA-NEXT: addi sp, sp, 32 26485; RV32IA-NEXT: ret 26486; 26487; RV64I-LABEL: atomicrmw_max_i64_release: 26488; RV64I: # %bb.0: 26489; RV64I-NEXT: addi sp, sp, -32 26490; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 26491; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 26492; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 26493; RV64I-NEXT: mv s0, a0 26494; RV64I-NEXT: ld a3, 0(a0) 26495; RV64I-NEXT: mv s1, a1 26496; RV64I-NEXT: j .LBB222_2 26497; RV64I-NEXT: .LBB222_1: # %atomicrmw.start 26498; RV64I-NEXT: # in Loop: Header=BB222_2 Depth=1 26499; RV64I-NEXT: sd a3, 0(sp) 26500; RV64I-NEXT: mv a1, sp 26501; RV64I-NEXT: li a3, 3 26502; RV64I-NEXT: mv a0, s0 26503; RV64I-NEXT: li a4, 0 26504; RV64I-NEXT: call __atomic_compare_exchange_8 26505; RV64I-NEXT: ld a3, 0(sp) 26506; RV64I-NEXT: bnez a0, .LBB222_4 26507; RV64I-NEXT: .LBB222_2: # %atomicrmw.start 26508; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 26509; RV64I-NEXT: mv a2, a3 26510; RV64I-NEXT: blt s1, a3, .LBB222_1 26511; RV64I-NEXT: # %bb.3: # %atomicrmw.start 26512; RV64I-NEXT: # in Loop: Header=BB222_2 Depth=1 26513; RV64I-NEXT: mv a2, s1 26514; RV64I-NEXT: j .LBB222_1 26515; RV64I-NEXT: .LBB222_4: # %atomicrmw.end 26516; RV64I-NEXT: mv a0, a3 26517; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 26518; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 26519; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 26520; RV64I-NEXT: addi sp, sp, 32 26521; RV64I-NEXT: ret 26522; 26523; RV64IA-WMO-LABEL: atomicrmw_max_i64_release: 26524; RV64IA-WMO: # %bb.0: 26525; RV64IA-WMO-NEXT: amomax.d.rl a0, a1, (a0) 26526; RV64IA-WMO-NEXT: ret 26527; 26528; RV64IA-TSO-LABEL: atomicrmw_max_i64_release: 26529; RV64IA-TSO: # %bb.0: 26530; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0) 26531; RV64IA-TSO-NEXT: ret 26532 %1 = atomicrmw max ptr %a, i64 %b release 26533 ret i64 %1 26534} 26535 26536define i64 @atomicrmw_max_i64_acq_rel(ptr %a, i64 %b) nounwind { 26537; RV32I-LABEL: atomicrmw_max_i64_acq_rel: 26538; RV32I: # %bb.0: 26539; RV32I-NEXT: addi sp, sp, -32 26540; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26541; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26542; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26543; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26544; RV32I-NEXT: mv s0, a2 26545; RV32I-NEXT: mv s1, a0 26546; RV32I-NEXT: lw a4, 0(a0) 26547; RV32I-NEXT: lw a5, 4(a0) 26548; RV32I-NEXT: mv s2, a1 26549; RV32I-NEXT: j .LBB223_2 26550; RV32I-NEXT: .LBB223_1: # %atomicrmw.start 26551; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1 26552; RV32I-NEXT: sw a4, 8(sp) 26553; RV32I-NEXT: sw a5, 12(sp) 26554; RV32I-NEXT: addi a1, sp, 8 26555; RV32I-NEXT: li a4, 4 26556; RV32I-NEXT: li a5, 2 26557; RV32I-NEXT: mv a0, s1 26558; RV32I-NEXT: call __atomic_compare_exchange_8 26559; RV32I-NEXT: lw a4, 8(sp) 26560; RV32I-NEXT: lw a5, 12(sp) 26561; RV32I-NEXT: bnez a0, .LBB223_7 26562; RV32I-NEXT: .LBB223_2: # %atomicrmw.start 26563; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 26564; RV32I-NEXT: beq a5, s0, .LBB223_4 26565; RV32I-NEXT: # %bb.3: # %atomicrmw.start 26566; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1 26567; RV32I-NEXT: slt a0, s0, a5 26568; RV32I-NEXT: j .LBB223_5 26569; RV32I-NEXT: .LBB223_4: # in Loop: Header=BB223_2 Depth=1 26570; RV32I-NEXT: sltu a0, s2, a4 26571; RV32I-NEXT: .LBB223_5: # %atomicrmw.start 26572; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1 26573; RV32I-NEXT: mv a2, a4 26574; RV32I-NEXT: mv a3, a5 26575; RV32I-NEXT: bnez a0, .LBB223_1 26576; RV32I-NEXT: # %bb.6: # %atomicrmw.start 26577; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1 26578; RV32I-NEXT: mv a2, s2 26579; RV32I-NEXT: mv a3, s0 26580; RV32I-NEXT: j .LBB223_1 26581; RV32I-NEXT: .LBB223_7: # %atomicrmw.end 26582; RV32I-NEXT: mv a0, a4 26583; RV32I-NEXT: mv a1, a5 26584; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26585; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26586; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26587; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26588; RV32I-NEXT: addi sp, sp, 32 26589; RV32I-NEXT: ret 26590; 26591; RV32IA-LABEL: atomicrmw_max_i64_acq_rel: 26592; RV32IA: # %bb.0: 26593; RV32IA-NEXT: addi sp, sp, -32 26594; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26595; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26596; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26597; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26598; RV32IA-NEXT: mv s0, a2 26599; RV32IA-NEXT: mv s1, a0 26600; RV32IA-NEXT: lw a4, 0(a0) 26601; RV32IA-NEXT: lw a5, 4(a0) 26602; RV32IA-NEXT: mv s2, a1 26603; RV32IA-NEXT: j .LBB223_2 26604; RV32IA-NEXT: .LBB223_1: # %atomicrmw.start 26605; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1 26606; RV32IA-NEXT: sw a4, 8(sp) 26607; RV32IA-NEXT: sw a5, 12(sp) 26608; RV32IA-NEXT: addi a1, sp, 8 26609; RV32IA-NEXT: li a4, 4 26610; RV32IA-NEXT: li a5, 2 26611; RV32IA-NEXT: mv a0, s1 26612; RV32IA-NEXT: call __atomic_compare_exchange_8 26613; RV32IA-NEXT: lw a4, 8(sp) 26614; RV32IA-NEXT: lw a5, 12(sp) 26615; RV32IA-NEXT: bnez a0, .LBB223_7 26616; RV32IA-NEXT: .LBB223_2: # %atomicrmw.start 26617; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 26618; RV32IA-NEXT: beq a5, s0, .LBB223_4 26619; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 26620; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1 26621; RV32IA-NEXT: slt a0, s0, a5 26622; RV32IA-NEXT: j .LBB223_5 26623; RV32IA-NEXT: .LBB223_4: # in Loop: Header=BB223_2 Depth=1 26624; RV32IA-NEXT: sltu a0, s2, a4 26625; RV32IA-NEXT: .LBB223_5: # %atomicrmw.start 26626; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1 26627; RV32IA-NEXT: mv a2, a4 26628; RV32IA-NEXT: mv a3, a5 26629; RV32IA-NEXT: bnez a0, .LBB223_1 26630; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 26631; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1 26632; RV32IA-NEXT: mv a2, s2 26633; RV32IA-NEXT: mv a3, s0 26634; RV32IA-NEXT: j .LBB223_1 26635; RV32IA-NEXT: .LBB223_7: # %atomicrmw.end 26636; RV32IA-NEXT: mv a0, a4 26637; RV32IA-NEXT: mv a1, a5 26638; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26639; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26640; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26641; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26642; RV32IA-NEXT: addi sp, sp, 32 26643; RV32IA-NEXT: ret 26644; 26645; RV64I-LABEL: atomicrmw_max_i64_acq_rel: 26646; RV64I: # %bb.0: 26647; RV64I-NEXT: addi sp, sp, -32 26648; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 26649; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 26650; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 26651; RV64I-NEXT: mv s0, a0 26652; RV64I-NEXT: ld a3, 0(a0) 26653; RV64I-NEXT: mv s1, a1 26654; RV64I-NEXT: j .LBB223_2 26655; RV64I-NEXT: .LBB223_1: # %atomicrmw.start 26656; RV64I-NEXT: # in Loop: Header=BB223_2 Depth=1 26657; RV64I-NEXT: sd a3, 0(sp) 26658; RV64I-NEXT: mv a1, sp 26659; RV64I-NEXT: li a3, 4 26660; RV64I-NEXT: li a4, 2 26661; RV64I-NEXT: mv a0, s0 26662; RV64I-NEXT: call __atomic_compare_exchange_8 26663; RV64I-NEXT: ld a3, 0(sp) 26664; RV64I-NEXT: bnez a0, .LBB223_4 26665; RV64I-NEXT: .LBB223_2: # %atomicrmw.start 26666; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 26667; RV64I-NEXT: mv a2, a3 26668; RV64I-NEXT: blt s1, a3, .LBB223_1 26669; RV64I-NEXT: # %bb.3: # %atomicrmw.start 26670; RV64I-NEXT: # in Loop: Header=BB223_2 Depth=1 26671; RV64I-NEXT: mv a2, s1 26672; RV64I-NEXT: j .LBB223_1 26673; RV64I-NEXT: .LBB223_4: # %atomicrmw.end 26674; RV64I-NEXT: mv a0, a3 26675; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 26676; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 26677; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 26678; RV64I-NEXT: addi sp, sp, 32 26679; RV64I-NEXT: ret 26680; 26681; RV64IA-WMO-LABEL: atomicrmw_max_i64_acq_rel: 26682; RV64IA-WMO: # %bb.0: 26683; RV64IA-WMO-NEXT: amomax.d.aqrl a0, a1, (a0) 26684; RV64IA-WMO-NEXT: ret 26685; 26686; RV64IA-TSO-LABEL: atomicrmw_max_i64_acq_rel: 26687; RV64IA-TSO: # %bb.0: 26688; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0) 26689; RV64IA-TSO-NEXT: ret 26690 %1 = atomicrmw max ptr %a, i64 %b acq_rel 26691 ret i64 %1 26692} 26693 26694define i64 @atomicrmw_max_i64_seq_cst(ptr %a, i64 %b) nounwind { 26695; RV32I-LABEL: atomicrmw_max_i64_seq_cst: 26696; RV32I: # %bb.0: 26697; RV32I-NEXT: addi sp, sp, -32 26698; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26699; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26700; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26701; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26702; RV32I-NEXT: mv s0, a2 26703; RV32I-NEXT: mv s1, a0 26704; RV32I-NEXT: lw a4, 0(a0) 26705; RV32I-NEXT: lw a5, 4(a0) 26706; RV32I-NEXT: mv s2, a1 26707; RV32I-NEXT: j .LBB224_2 26708; RV32I-NEXT: .LBB224_1: # %atomicrmw.start 26709; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1 26710; RV32I-NEXT: sw a4, 8(sp) 26711; RV32I-NEXT: sw a5, 12(sp) 26712; RV32I-NEXT: addi a1, sp, 8 26713; RV32I-NEXT: li a4, 5 26714; RV32I-NEXT: li a5, 5 26715; RV32I-NEXT: mv a0, s1 26716; RV32I-NEXT: call __atomic_compare_exchange_8 26717; RV32I-NEXT: lw a4, 8(sp) 26718; RV32I-NEXT: lw a5, 12(sp) 26719; RV32I-NEXT: bnez a0, .LBB224_7 26720; RV32I-NEXT: .LBB224_2: # %atomicrmw.start 26721; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 26722; RV32I-NEXT: beq a5, s0, .LBB224_4 26723; RV32I-NEXT: # %bb.3: # %atomicrmw.start 26724; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1 26725; RV32I-NEXT: slt a0, s0, a5 26726; RV32I-NEXT: j .LBB224_5 26727; RV32I-NEXT: .LBB224_4: # in Loop: Header=BB224_2 Depth=1 26728; RV32I-NEXT: sltu a0, s2, a4 26729; RV32I-NEXT: .LBB224_5: # %atomicrmw.start 26730; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1 26731; RV32I-NEXT: mv a2, a4 26732; RV32I-NEXT: mv a3, a5 26733; RV32I-NEXT: bnez a0, .LBB224_1 26734; RV32I-NEXT: # %bb.6: # %atomicrmw.start 26735; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1 26736; RV32I-NEXT: mv a2, s2 26737; RV32I-NEXT: mv a3, s0 26738; RV32I-NEXT: j .LBB224_1 26739; RV32I-NEXT: .LBB224_7: # %atomicrmw.end 26740; RV32I-NEXT: mv a0, a4 26741; RV32I-NEXT: mv a1, a5 26742; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26743; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26744; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26745; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26746; RV32I-NEXT: addi sp, sp, 32 26747; RV32I-NEXT: ret 26748; 26749; RV32IA-LABEL: atomicrmw_max_i64_seq_cst: 26750; RV32IA: # %bb.0: 26751; RV32IA-NEXT: addi sp, sp, -32 26752; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26753; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26754; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26755; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26756; RV32IA-NEXT: mv s0, a2 26757; RV32IA-NEXT: mv s1, a0 26758; RV32IA-NEXT: lw a4, 0(a0) 26759; RV32IA-NEXT: lw a5, 4(a0) 26760; RV32IA-NEXT: mv s2, a1 26761; RV32IA-NEXT: j .LBB224_2 26762; RV32IA-NEXT: .LBB224_1: # %atomicrmw.start 26763; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1 26764; RV32IA-NEXT: sw a4, 8(sp) 26765; RV32IA-NEXT: sw a5, 12(sp) 26766; RV32IA-NEXT: addi a1, sp, 8 26767; RV32IA-NEXT: li a4, 5 26768; RV32IA-NEXT: li a5, 5 26769; RV32IA-NEXT: mv a0, s1 26770; RV32IA-NEXT: call __atomic_compare_exchange_8 26771; RV32IA-NEXT: lw a4, 8(sp) 26772; RV32IA-NEXT: lw a5, 12(sp) 26773; RV32IA-NEXT: bnez a0, .LBB224_7 26774; RV32IA-NEXT: .LBB224_2: # %atomicrmw.start 26775; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 26776; RV32IA-NEXT: beq a5, s0, .LBB224_4 26777; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 26778; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1 26779; RV32IA-NEXT: slt a0, s0, a5 26780; RV32IA-NEXT: j .LBB224_5 26781; RV32IA-NEXT: .LBB224_4: # in Loop: Header=BB224_2 Depth=1 26782; RV32IA-NEXT: sltu a0, s2, a4 26783; RV32IA-NEXT: .LBB224_5: # %atomicrmw.start 26784; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1 26785; RV32IA-NEXT: mv a2, a4 26786; RV32IA-NEXT: mv a3, a5 26787; RV32IA-NEXT: bnez a0, .LBB224_1 26788; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 26789; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1 26790; RV32IA-NEXT: mv a2, s2 26791; RV32IA-NEXT: mv a3, s0 26792; RV32IA-NEXT: j .LBB224_1 26793; RV32IA-NEXT: .LBB224_7: # %atomicrmw.end 26794; RV32IA-NEXT: mv a0, a4 26795; RV32IA-NEXT: mv a1, a5 26796; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26797; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26798; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26799; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26800; RV32IA-NEXT: addi sp, sp, 32 26801; RV32IA-NEXT: ret 26802; 26803; RV64I-LABEL: atomicrmw_max_i64_seq_cst: 26804; RV64I: # %bb.0: 26805; RV64I-NEXT: addi sp, sp, -32 26806; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 26807; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 26808; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 26809; RV64I-NEXT: mv s0, a0 26810; RV64I-NEXT: ld a3, 0(a0) 26811; RV64I-NEXT: mv s1, a1 26812; RV64I-NEXT: j .LBB224_2 26813; RV64I-NEXT: .LBB224_1: # %atomicrmw.start 26814; RV64I-NEXT: # in Loop: Header=BB224_2 Depth=1 26815; RV64I-NEXT: sd a3, 0(sp) 26816; RV64I-NEXT: mv a1, sp 26817; RV64I-NEXT: li a3, 5 26818; RV64I-NEXT: li a4, 5 26819; RV64I-NEXT: mv a0, s0 26820; RV64I-NEXT: call __atomic_compare_exchange_8 26821; RV64I-NEXT: ld a3, 0(sp) 26822; RV64I-NEXT: bnez a0, .LBB224_4 26823; RV64I-NEXT: .LBB224_2: # %atomicrmw.start 26824; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 26825; RV64I-NEXT: mv a2, a3 26826; RV64I-NEXT: blt s1, a3, .LBB224_1 26827; RV64I-NEXT: # %bb.3: # %atomicrmw.start 26828; RV64I-NEXT: # in Loop: Header=BB224_2 Depth=1 26829; RV64I-NEXT: mv a2, s1 26830; RV64I-NEXT: j .LBB224_1 26831; RV64I-NEXT: .LBB224_4: # %atomicrmw.end 26832; RV64I-NEXT: mv a0, a3 26833; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 26834; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 26835; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 26836; RV64I-NEXT: addi sp, sp, 32 26837; RV64I-NEXT: ret 26838; 26839; RV64IA-WMO-LABEL: atomicrmw_max_i64_seq_cst: 26840; RV64IA-WMO: # %bb.0: 26841; RV64IA-WMO-NEXT: amomax.d.aqrl a0, a1, (a0) 26842; RV64IA-WMO-NEXT: ret 26843; 26844; RV64IA-TSO-LABEL: atomicrmw_max_i64_seq_cst: 26845; RV64IA-TSO: # %bb.0: 26846; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0) 26847; RV64IA-TSO-NEXT: ret 26848 %1 = atomicrmw max ptr %a, i64 %b seq_cst 26849 ret i64 %1 26850} 26851 26852define i64 @atomicrmw_min_i64_monotonic(ptr %a, i64 %b) nounwind { 26853; RV32I-LABEL: atomicrmw_min_i64_monotonic: 26854; RV32I: # %bb.0: 26855; RV32I-NEXT: addi sp, sp, -32 26856; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26857; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26858; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26859; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26860; RV32I-NEXT: mv s0, a2 26861; RV32I-NEXT: mv s1, a0 26862; RV32I-NEXT: lw a4, 0(a0) 26863; RV32I-NEXT: lw a5, 4(a0) 26864; RV32I-NEXT: mv s2, a1 26865; RV32I-NEXT: j .LBB225_2 26866; RV32I-NEXT: .LBB225_1: # %atomicrmw.start 26867; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1 26868; RV32I-NEXT: sw a4, 8(sp) 26869; RV32I-NEXT: sw a5, 12(sp) 26870; RV32I-NEXT: addi a1, sp, 8 26871; RV32I-NEXT: mv a0, s1 26872; RV32I-NEXT: li a4, 0 26873; RV32I-NEXT: li a5, 0 26874; RV32I-NEXT: call __atomic_compare_exchange_8 26875; RV32I-NEXT: lw a4, 8(sp) 26876; RV32I-NEXT: lw a5, 12(sp) 26877; RV32I-NEXT: bnez a0, .LBB225_7 26878; RV32I-NEXT: .LBB225_2: # %atomicrmw.start 26879; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 26880; RV32I-NEXT: beq a5, s0, .LBB225_4 26881; RV32I-NEXT: # %bb.3: # %atomicrmw.start 26882; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1 26883; RV32I-NEXT: slt a0, s0, a5 26884; RV32I-NEXT: j .LBB225_5 26885; RV32I-NEXT: .LBB225_4: # in Loop: Header=BB225_2 Depth=1 26886; RV32I-NEXT: sltu a0, s2, a4 26887; RV32I-NEXT: .LBB225_5: # %atomicrmw.start 26888; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1 26889; RV32I-NEXT: mv a2, a4 26890; RV32I-NEXT: mv a3, a5 26891; RV32I-NEXT: beqz a0, .LBB225_1 26892; RV32I-NEXT: # %bb.6: # %atomicrmw.start 26893; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1 26894; RV32I-NEXT: mv a2, s2 26895; RV32I-NEXT: mv a3, s0 26896; RV32I-NEXT: j .LBB225_1 26897; RV32I-NEXT: .LBB225_7: # %atomicrmw.end 26898; RV32I-NEXT: mv a0, a4 26899; RV32I-NEXT: mv a1, a5 26900; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26901; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26902; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26903; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26904; RV32I-NEXT: addi sp, sp, 32 26905; RV32I-NEXT: ret 26906; 26907; RV32IA-LABEL: atomicrmw_min_i64_monotonic: 26908; RV32IA: # %bb.0: 26909; RV32IA-NEXT: addi sp, sp, -32 26910; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 26911; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 26912; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 26913; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 26914; RV32IA-NEXT: mv s0, a2 26915; RV32IA-NEXT: mv s1, a0 26916; RV32IA-NEXT: lw a4, 0(a0) 26917; RV32IA-NEXT: lw a5, 4(a0) 26918; RV32IA-NEXT: mv s2, a1 26919; RV32IA-NEXT: j .LBB225_2 26920; RV32IA-NEXT: .LBB225_1: # %atomicrmw.start 26921; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1 26922; RV32IA-NEXT: sw a4, 8(sp) 26923; RV32IA-NEXT: sw a5, 12(sp) 26924; RV32IA-NEXT: addi a1, sp, 8 26925; RV32IA-NEXT: mv a0, s1 26926; RV32IA-NEXT: li a4, 0 26927; RV32IA-NEXT: li a5, 0 26928; RV32IA-NEXT: call __atomic_compare_exchange_8 26929; RV32IA-NEXT: lw a4, 8(sp) 26930; RV32IA-NEXT: lw a5, 12(sp) 26931; RV32IA-NEXT: bnez a0, .LBB225_7 26932; RV32IA-NEXT: .LBB225_2: # %atomicrmw.start 26933; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 26934; RV32IA-NEXT: beq a5, s0, .LBB225_4 26935; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 26936; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1 26937; RV32IA-NEXT: slt a0, s0, a5 26938; RV32IA-NEXT: j .LBB225_5 26939; RV32IA-NEXT: .LBB225_4: # in Loop: Header=BB225_2 Depth=1 26940; RV32IA-NEXT: sltu a0, s2, a4 26941; RV32IA-NEXT: .LBB225_5: # %atomicrmw.start 26942; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1 26943; RV32IA-NEXT: mv a2, a4 26944; RV32IA-NEXT: mv a3, a5 26945; RV32IA-NEXT: beqz a0, .LBB225_1 26946; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 26947; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1 26948; RV32IA-NEXT: mv a2, s2 26949; RV32IA-NEXT: mv a3, s0 26950; RV32IA-NEXT: j .LBB225_1 26951; RV32IA-NEXT: .LBB225_7: # %atomicrmw.end 26952; RV32IA-NEXT: mv a0, a4 26953; RV32IA-NEXT: mv a1, a5 26954; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 26955; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26956; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 26957; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 26958; RV32IA-NEXT: addi sp, sp, 32 26959; RV32IA-NEXT: ret 26960; 26961; RV64I-LABEL: atomicrmw_min_i64_monotonic: 26962; RV64I: # %bb.0: 26963; RV64I-NEXT: addi sp, sp, -32 26964; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 26965; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 26966; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 26967; RV64I-NEXT: mv s0, a0 26968; RV64I-NEXT: ld a3, 0(a0) 26969; RV64I-NEXT: mv s1, a1 26970; RV64I-NEXT: j .LBB225_2 26971; RV64I-NEXT: .LBB225_1: # %atomicrmw.start 26972; RV64I-NEXT: # in Loop: Header=BB225_2 Depth=1 26973; RV64I-NEXT: sd a3, 0(sp) 26974; RV64I-NEXT: mv a1, sp 26975; RV64I-NEXT: mv a0, s0 26976; RV64I-NEXT: li a3, 0 26977; RV64I-NEXT: li a4, 0 26978; RV64I-NEXT: call __atomic_compare_exchange_8 26979; RV64I-NEXT: ld a3, 0(sp) 26980; RV64I-NEXT: bnez a0, .LBB225_4 26981; RV64I-NEXT: .LBB225_2: # %atomicrmw.start 26982; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 26983; RV64I-NEXT: mv a2, a3 26984; RV64I-NEXT: bge s1, a3, .LBB225_1 26985; RV64I-NEXT: # %bb.3: # %atomicrmw.start 26986; RV64I-NEXT: # in Loop: Header=BB225_2 Depth=1 26987; RV64I-NEXT: mv a2, s1 26988; RV64I-NEXT: j .LBB225_1 26989; RV64I-NEXT: .LBB225_4: # %atomicrmw.end 26990; RV64I-NEXT: mv a0, a3 26991; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 26992; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 26993; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 26994; RV64I-NEXT: addi sp, sp, 32 26995; RV64I-NEXT: ret 26996; 26997; RV64IA-LABEL: atomicrmw_min_i64_monotonic: 26998; RV64IA: # %bb.0: 26999; RV64IA-NEXT: amomin.d a0, a1, (a0) 27000; RV64IA-NEXT: ret 27001 %1 = atomicrmw min ptr %a, i64 %b monotonic 27002 ret i64 %1 27003} 27004 27005define i64 @atomicrmw_min_i64_acquire(ptr %a, i64 %b) nounwind { 27006; RV32I-LABEL: atomicrmw_min_i64_acquire: 27007; RV32I: # %bb.0: 27008; RV32I-NEXT: addi sp, sp, -32 27009; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27010; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27011; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27012; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27013; RV32I-NEXT: mv s0, a2 27014; RV32I-NEXT: mv s1, a0 27015; RV32I-NEXT: lw a4, 0(a0) 27016; RV32I-NEXT: lw a5, 4(a0) 27017; RV32I-NEXT: mv s2, a1 27018; RV32I-NEXT: j .LBB226_2 27019; RV32I-NEXT: .LBB226_1: # %atomicrmw.start 27020; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1 27021; RV32I-NEXT: sw a4, 8(sp) 27022; RV32I-NEXT: sw a5, 12(sp) 27023; RV32I-NEXT: addi a1, sp, 8 27024; RV32I-NEXT: li a4, 2 27025; RV32I-NEXT: li a5, 2 27026; RV32I-NEXT: mv a0, s1 27027; RV32I-NEXT: call __atomic_compare_exchange_8 27028; RV32I-NEXT: lw a4, 8(sp) 27029; RV32I-NEXT: lw a5, 12(sp) 27030; RV32I-NEXT: bnez a0, .LBB226_7 27031; RV32I-NEXT: .LBB226_2: # %atomicrmw.start 27032; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27033; RV32I-NEXT: beq a5, s0, .LBB226_4 27034; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27035; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1 27036; RV32I-NEXT: slt a0, s0, a5 27037; RV32I-NEXT: j .LBB226_5 27038; RV32I-NEXT: .LBB226_4: # in Loop: Header=BB226_2 Depth=1 27039; RV32I-NEXT: sltu a0, s2, a4 27040; RV32I-NEXT: .LBB226_5: # %atomicrmw.start 27041; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1 27042; RV32I-NEXT: mv a2, a4 27043; RV32I-NEXT: mv a3, a5 27044; RV32I-NEXT: beqz a0, .LBB226_1 27045; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27046; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1 27047; RV32I-NEXT: mv a2, s2 27048; RV32I-NEXT: mv a3, s0 27049; RV32I-NEXT: j .LBB226_1 27050; RV32I-NEXT: .LBB226_7: # %atomicrmw.end 27051; RV32I-NEXT: mv a0, a4 27052; RV32I-NEXT: mv a1, a5 27053; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27054; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27055; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27056; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27057; RV32I-NEXT: addi sp, sp, 32 27058; RV32I-NEXT: ret 27059; 27060; RV32IA-LABEL: atomicrmw_min_i64_acquire: 27061; RV32IA: # %bb.0: 27062; RV32IA-NEXT: addi sp, sp, -32 27063; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27064; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27065; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27066; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27067; RV32IA-NEXT: mv s0, a2 27068; RV32IA-NEXT: mv s1, a0 27069; RV32IA-NEXT: lw a4, 0(a0) 27070; RV32IA-NEXT: lw a5, 4(a0) 27071; RV32IA-NEXT: mv s2, a1 27072; RV32IA-NEXT: j .LBB226_2 27073; RV32IA-NEXT: .LBB226_1: # %atomicrmw.start 27074; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1 27075; RV32IA-NEXT: sw a4, 8(sp) 27076; RV32IA-NEXT: sw a5, 12(sp) 27077; RV32IA-NEXT: addi a1, sp, 8 27078; RV32IA-NEXT: li a4, 2 27079; RV32IA-NEXT: li a5, 2 27080; RV32IA-NEXT: mv a0, s1 27081; RV32IA-NEXT: call __atomic_compare_exchange_8 27082; RV32IA-NEXT: lw a4, 8(sp) 27083; RV32IA-NEXT: lw a5, 12(sp) 27084; RV32IA-NEXT: bnez a0, .LBB226_7 27085; RV32IA-NEXT: .LBB226_2: # %atomicrmw.start 27086; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 27087; RV32IA-NEXT: beq a5, s0, .LBB226_4 27088; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 27089; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1 27090; RV32IA-NEXT: slt a0, s0, a5 27091; RV32IA-NEXT: j .LBB226_5 27092; RV32IA-NEXT: .LBB226_4: # in Loop: Header=BB226_2 Depth=1 27093; RV32IA-NEXT: sltu a0, s2, a4 27094; RV32IA-NEXT: .LBB226_5: # %atomicrmw.start 27095; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1 27096; RV32IA-NEXT: mv a2, a4 27097; RV32IA-NEXT: mv a3, a5 27098; RV32IA-NEXT: beqz a0, .LBB226_1 27099; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 27100; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1 27101; RV32IA-NEXT: mv a2, s2 27102; RV32IA-NEXT: mv a3, s0 27103; RV32IA-NEXT: j .LBB226_1 27104; RV32IA-NEXT: .LBB226_7: # %atomicrmw.end 27105; RV32IA-NEXT: mv a0, a4 27106; RV32IA-NEXT: mv a1, a5 27107; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27108; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27109; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27110; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27111; RV32IA-NEXT: addi sp, sp, 32 27112; RV32IA-NEXT: ret 27113; 27114; RV64I-LABEL: atomicrmw_min_i64_acquire: 27115; RV64I: # %bb.0: 27116; RV64I-NEXT: addi sp, sp, -32 27117; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 27118; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 27119; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 27120; RV64I-NEXT: mv s0, a0 27121; RV64I-NEXT: ld a3, 0(a0) 27122; RV64I-NEXT: mv s1, a1 27123; RV64I-NEXT: j .LBB226_2 27124; RV64I-NEXT: .LBB226_1: # %atomicrmw.start 27125; RV64I-NEXT: # in Loop: Header=BB226_2 Depth=1 27126; RV64I-NEXT: sd a3, 0(sp) 27127; RV64I-NEXT: mv a1, sp 27128; RV64I-NEXT: li a3, 2 27129; RV64I-NEXT: li a4, 2 27130; RV64I-NEXT: mv a0, s0 27131; RV64I-NEXT: call __atomic_compare_exchange_8 27132; RV64I-NEXT: ld a3, 0(sp) 27133; RV64I-NEXT: bnez a0, .LBB226_4 27134; RV64I-NEXT: .LBB226_2: # %atomicrmw.start 27135; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 27136; RV64I-NEXT: mv a2, a3 27137; RV64I-NEXT: bge s1, a3, .LBB226_1 27138; RV64I-NEXT: # %bb.3: # %atomicrmw.start 27139; RV64I-NEXT: # in Loop: Header=BB226_2 Depth=1 27140; RV64I-NEXT: mv a2, s1 27141; RV64I-NEXT: j .LBB226_1 27142; RV64I-NEXT: .LBB226_4: # %atomicrmw.end 27143; RV64I-NEXT: mv a0, a3 27144; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 27145; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 27146; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 27147; RV64I-NEXT: addi sp, sp, 32 27148; RV64I-NEXT: ret 27149; 27150; RV64IA-WMO-LABEL: atomicrmw_min_i64_acquire: 27151; RV64IA-WMO: # %bb.0: 27152; RV64IA-WMO-NEXT: amomin.d.aq a0, a1, (a0) 27153; RV64IA-WMO-NEXT: ret 27154; 27155; RV64IA-TSO-LABEL: atomicrmw_min_i64_acquire: 27156; RV64IA-TSO: # %bb.0: 27157; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0) 27158; RV64IA-TSO-NEXT: ret 27159 %1 = atomicrmw min ptr %a, i64 %b acquire 27160 ret i64 %1 27161} 27162 27163define i64 @atomicrmw_min_i64_release(ptr %a, i64 %b) nounwind { 27164; RV32I-LABEL: atomicrmw_min_i64_release: 27165; RV32I: # %bb.0: 27166; RV32I-NEXT: addi sp, sp, -32 27167; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27168; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27169; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27170; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27171; RV32I-NEXT: mv s0, a2 27172; RV32I-NEXT: mv s1, a0 27173; RV32I-NEXT: lw a4, 0(a0) 27174; RV32I-NEXT: lw a5, 4(a0) 27175; RV32I-NEXT: mv s2, a1 27176; RV32I-NEXT: j .LBB227_2 27177; RV32I-NEXT: .LBB227_1: # %atomicrmw.start 27178; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1 27179; RV32I-NEXT: sw a4, 8(sp) 27180; RV32I-NEXT: sw a5, 12(sp) 27181; RV32I-NEXT: addi a1, sp, 8 27182; RV32I-NEXT: li a4, 3 27183; RV32I-NEXT: mv a0, s1 27184; RV32I-NEXT: li a5, 0 27185; RV32I-NEXT: call __atomic_compare_exchange_8 27186; RV32I-NEXT: lw a4, 8(sp) 27187; RV32I-NEXT: lw a5, 12(sp) 27188; RV32I-NEXT: bnez a0, .LBB227_7 27189; RV32I-NEXT: .LBB227_2: # %atomicrmw.start 27190; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27191; RV32I-NEXT: beq a5, s0, .LBB227_4 27192; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27193; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1 27194; RV32I-NEXT: slt a0, s0, a5 27195; RV32I-NEXT: j .LBB227_5 27196; RV32I-NEXT: .LBB227_4: # in Loop: Header=BB227_2 Depth=1 27197; RV32I-NEXT: sltu a0, s2, a4 27198; RV32I-NEXT: .LBB227_5: # %atomicrmw.start 27199; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1 27200; RV32I-NEXT: mv a2, a4 27201; RV32I-NEXT: mv a3, a5 27202; RV32I-NEXT: beqz a0, .LBB227_1 27203; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27204; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1 27205; RV32I-NEXT: mv a2, s2 27206; RV32I-NEXT: mv a3, s0 27207; RV32I-NEXT: j .LBB227_1 27208; RV32I-NEXT: .LBB227_7: # %atomicrmw.end 27209; RV32I-NEXT: mv a0, a4 27210; RV32I-NEXT: mv a1, a5 27211; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27212; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27213; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27214; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27215; RV32I-NEXT: addi sp, sp, 32 27216; RV32I-NEXT: ret 27217; 27218; RV32IA-LABEL: atomicrmw_min_i64_release: 27219; RV32IA: # %bb.0: 27220; RV32IA-NEXT: addi sp, sp, -32 27221; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27222; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27223; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27224; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27225; RV32IA-NEXT: mv s0, a2 27226; RV32IA-NEXT: mv s1, a0 27227; RV32IA-NEXT: lw a4, 0(a0) 27228; RV32IA-NEXT: lw a5, 4(a0) 27229; RV32IA-NEXT: mv s2, a1 27230; RV32IA-NEXT: j .LBB227_2 27231; RV32IA-NEXT: .LBB227_1: # %atomicrmw.start 27232; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1 27233; RV32IA-NEXT: sw a4, 8(sp) 27234; RV32IA-NEXT: sw a5, 12(sp) 27235; RV32IA-NEXT: addi a1, sp, 8 27236; RV32IA-NEXT: li a4, 3 27237; RV32IA-NEXT: mv a0, s1 27238; RV32IA-NEXT: li a5, 0 27239; RV32IA-NEXT: call __atomic_compare_exchange_8 27240; RV32IA-NEXT: lw a4, 8(sp) 27241; RV32IA-NEXT: lw a5, 12(sp) 27242; RV32IA-NEXT: bnez a0, .LBB227_7 27243; RV32IA-NEXT: .LBB227_2: # %atomicrmw.start 27244; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 27245; RV32IA-NEXT: beq a5, s0, .LBB227_4 27246; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 27247; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1 27248; RV32IA-NEXT: slt a0, s0, a5 27249; RV32IA-NEXT: j .LBB227_5 27250; RV32IA-NEXT: .LBB227_4: # in Loop: Header=BB227_2 Depth=1 27251; RV32IA-NEXT: sltu a0, s2, a4 27252; RV32IA-NEXT: .LBB227_5: # %atomicrmw.start 27253; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1 27254; RV32IA-NEXT: mv a2, a4 27255; RV32IA-NEXT: mv a3, a5 27256; RV32IA-NEXT: beqz a0, .LBB227_1 27257; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 27258; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1 27259; RV32IA-NEXT: mv a2, s2 27260; RV32IA-NEXT: mv a3, s0 27261; RV32IA-NEXT: j .LBB227_1 27262; RV32IA-NEXT: .LBB227_7: # %atomicrmw.end 27263; RV32IA-NEXT: mv a0, a4 27264; RV32IA-NEXT: mv a1, a5 27265; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27266; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27267; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27268; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27269; RV32IA-NEXT: addi sp, sp, 32 27270; RV32IA-NEXT: ret 27271; 27272; RV64I-LABEL: atomicrmw_min_i64_release: 27273; RV64I: # %bb.0: 27274; RV64I-NEXT: addi sp, sp, -32 27275; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 27276; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 27277; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 27278; RV64I-NEXT: mv s0, a0 27279; RV64I-NEXT: ld a3, 0(a0) 27280; RV64I-NEXT: mv s1, a1 27281; RV64I-NEXT: j .LBB227_2 27282; RV64I-NEXT: .LBB227_1: # %atomicrmw.start 27283; RV64I-NEXT: # in Loop: Header=BB227_2 Depth=1 27284; RV64I-NEXT: sd a3, 0(sp) 27285; RV64I-NEXT: mv a1, sp 27286; RV64I-NEXT: li a3, 3 27287; RV64I-NEXT: mv a0, s0 27288; RV64I-NEXT: li a4, 0 27289; RV64I-NEXT: call __atomic_compare_exchange_8 27290; RV64I-NEXT: ld a3, 0(sp) 27291; RV64I-NEXT: bnez a0, .LBB227_4 27292; RV64I-NEXT: .LBB227_2: # %atomicrmw.start 27293; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 27294; RV64I-NEXT: mv a2, a3 27295; RV64I-NEXT: bge s1, a3, .LBB227_1 27296; RV64I-NEXT: # %bb.3: # %atomicrmw.start 27297; RV64I-NEXT: # in Loop: Header=BB227_2 Depth=1 27298; RV64I-NEXT: mv a2, s1 27299; RV64I-NEXT: j .LBB227_1 27300; RV64I-NEXT: .LBB227_4: # %atomicrmw.end 27301; RV64I-NEXT: mv a0, a3 27302; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 27303; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 27304; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 27305; RV64I-NEXT: addi sp, sp, 32 27306; RV64I-NEXT: ret 27307; 27308; RV64IA-WMO-LABEL: atomicrmw_min_i64_release: 27309; RV64IA-WMO: # %bb.0: 27310; RV64IA-WMO-NEXT: amomin.d.rl a0, a1, (a0) 27311; RV64IA-WMO-NEXT: ret 27312; 27313; RV64IA-TSO-LABEL: atomicrmw_min_i64_release: 27314; RV64IA-TSO: # %bb.0: 27315; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0) 27316; RV64IA-TSO-NEXT: ret 27317 %1 = atomicrmw min ptr %a, i64 %b release 27318 ret i64 %1 27319} 27320 27321define i64 @atomicrmw_min_i64_acq_rel(ptr %a, i64 %b) nounwind { 27322; RV32I-LABEL: atomicrmw_min_i64_acq_rel: 27323; RV32I: # %bb.0: 27324; RV32I-NEXT: addi sp, sp, -32 27325; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27326; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27327; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27328; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27329; RV32I-NEXT: mv s0, a2 27330; RV32I-NEXT: mv s1, a0 27331; RV32I-NEXT: lw a4, 0(a0) 27332; RV32I-NEXT: lw a5, 4(a0) 27333; RV32I-NEXT: mv s2, a1 27334; RV32I-NEXT: j .LBB228_2 27335; RV32I-NEXT: .LBB228_1: # %atomicrmw.start 27336; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1 27337; RV32I-NEXT: sw a4, 8(sp) 27338; RV32I-NEXT: sw a5, 12(sp) 27339; RV32I-NEXT: addi a1, sp, 8 27340; RV32I-NEXT: li a4, 4 27341; RV32I-NEXT: li a5, 2 27342; RV32I-NEXT: mv a0, s1 27343; RV32I-NEXT: call __atomic_compare_exchange_8 27344; RV32I-NEXT: lw a4, 8(sp) 27345; RV32I-NEXT: lw a5, 12(sp) 27346; RV32I-NEXT: bnez a0, .LBB228_7 27347; RV32I-NEXT: .LBB228_2: # %atomicrmw.start 27348; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27349; RV32I-NEXT: beq a5, s0, .LBB228_4 27350; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27351; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1 27352; RV32I-NEXT: slt a0, s0, a5 27353; RV32I-NEXT: j .LBB228_5 27354; RV32I-NEXT: .LBB228_4: # in Loop: Header=BB228_2 Depth=1 27355; RV32I-NEXT: sltu a0, s2, a4 27356; RV32I-NEXT: .LBB228_5: # %atomicrmw.start 27357; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1 27358; RV32I-NEXT: mv a2, a4 27359; RV32I-NEXT: mv a3, a5 27360; RV32I-NEXT: beqz a0, .LBB228_1 27361; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27362; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1 27363; RV32I-NEXT: mv a2, s2 27364; RV32I-NEXT: mv a3, s0 27365; RV32I-NEXT: j .LBB228_1 27366; RV32I-NEXT: .LBB228_7: # %atomicrmw.end 27367; RV32I-NEXT: mv a0, a4 27368; RV32I-NEXT: mv a1, a5 27369; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27370; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27371; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27372; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27373; RV32I-NEXT: addi sp, sp, 32 27374; RV32I-NEXT: ret 27375; 27376; RV32IA-LABEL: atomicrmw_min_i64_acq_rel: 27377; RV32IA: # %bb.0: 27378; RV32IA-NEXT: addi sp, sp, -32 27379; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27380; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27381; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27382; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27383; RV32IA-NEXT: mv s0, a2 27384; RV32IA-NEXT: mv s1, a0 27385; RV32IA-NEXT: lw a4, 0(a0) 27386; RV32IA-NEXT: lw a5, 4(a0) 27387; RV32IA-NEXT: mv s2, a1 27388; RV32IA-NEXT: j .LBB228_2 27389; RV32IA-NEXT: .LBB228_1: # %atomicrmw.start 27390; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1 27391; RV32IA-NEXT: sw a4, 8(sp) 27392; RV32IA-NEXT: sw a5, 12(sp) 27393; RV32IA-NEXT: addi a1, sp, 8 27394; RV32IA-NEXT: li a4, 4 27395; RV32IA-NEXT: li a5, 2 27396; RV32IA-NEXT: mv a0, s1 27397; RV32IA-NEXT: call __atomic_compare_exchange_8 27398; RV32IA-NEXT: lw a4, 8(sp) 27399; RV32IA-NEXT: lw a5, 12(sp) 27400; RV32IA-NEXT: bnez a0, .LBB228_7 27401; RV32IA-NEXT: .LBB228_2: # %atomicrmw.start 27402; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 27403; RV32IA-NEXT: beq a5, s0, .LBB228_4 27404; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 27405; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1 27406; RV32IA-NEXT: slt a0, s0, a5 27407; RV32IA-NEXT: j .LBB228_5 27408; RV32IA-NEXT: .LBB228_4: # in Loop: Header=BB228_2 Depth=1 27409; RV32IA-NEXT: sltu a0, s2, a4 27410; RV32IA-NEXT: .LBB228_5: # %atomicrmw.start 27411; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1 27412; RV32IA-NEXT: mv a2, a4 27413; RV32IA-NEXT: mv a3, a5 27414; RV32IA-NEXT: beqz a0, .LBB228_1 27415; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 27416; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1 27417; RV32IA-NEXT: mv a2, s2 27418; RV32IA-NEXT: mv a3, s0 27419; RV32IA-NEXT: j .LBB228_1 27420; RV32IA-NEXT: .LBB228_7: # %atomicrmw.end 27421; RV32IA-NEXT: mv a0, a4 27422; RV32IA-NEXT: mv a1, a5 27423; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27424; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27425; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27426; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27427; RV32IA-NEXT: addi sp, sp, 32 27428; RV32IA-NEXT: ret 27429; 27430; RV64I-LABEL: atomicrmw_min_i64_acq_rel: 27431; RV64I: # %bb.0: 27432; RV64I-NEXT: addi sp, sp, -32 27433; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 27434; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 27435; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 27436; RV64I-NEXT: mv s0, a0 27437; RV64I-NEXT: ld a3, 0(a0) 27438; RV64I-NEXT: mv s1, a1 27439; RV64I-NEXT: j .LBB228_2 27440; RV64I-NEXT: .LBB228_1: # %atomicrmw.start 27441; RV64I-NEXT: # in Loop: Header=BB228_2 Depth=1 27442; RV64I-NEXT: sd a3, 0(sp) 27443; RV64I-NEXT: mv a1, sp 27444; RV64I-NEXT: li a3, 4 27445; RV64I-NEXT: li a4, 2 27446; RV64I-NEXT: mv a0, s0 27447; RV64I-NEXT: call __atomic_compare_exchange_8 27448; RV64I-NEXT: ld a3, 0(sp) 27449; RV64I-NEXT: bnez a0, .LBB228_4 27450; RV64I-NEXT: .LBB228_2: # %atomicrmw.start 27451; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 27452; RV64I-NEXT: mv a2, a3 27453; RV64I-NEXT: bge s1, a3, .LBB228_1 27454; RV64I-NEXT: # %bb.3: # %atomicrmw.start 27455; RV64I-NEXT: # in Loop: Header=BB228_2 Depth=1 27456; RV64I-NEXT: mv a2, s1 27457; RV64I-NEXT: j .LBB228_1 27458; RV64I-NEXT: .LBB228_4: # %atomicrmw.end 27459; RV64I-NEXT: mv a0, a3 27460; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 27461; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 27462; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 27463; RV64I-NEXT: addi sp, sp, 32 27464; RV64I-NEXT: ret 27465; 27466; RV64IA-WMO-LABEL: atomicrmw_min_i64_acq_rel: 27467; RV64IA-WMO: # %bb.0: 27468; RV64IA-WMO-NEXT: amomin.d.aqrl a0, a1, (a0) 27469; RV64IA-WMO-NEXT: ret 27470; 27471; RV64IA-TSO-LABEL: atomicrmw_min_i64_acq_rel: 27472; RV64IA-TSO: # %bb.0: 27473; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0) 27474; RV64IA-TSO-NEXT: ret 27475 %1 = atomicrmw min ptr %a, i64 %b acq_rel 27476 ret i64 %1 27477} 27478 27479define i64 @atomicrmw_min_i64_seq_cst(ptr %a, i64 %b) nounwind { 27480; RV32I-LABEL: atomicrmw_min_i64_seq_cst: 27481; RV32I: # %bb.0: 27482; RV32I-NEXT: addi sp, sp, -32 27483; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27484; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27485; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27486; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27487; RV32I-NEXT: mv s0, a2 27488; RV32I-NEXT: mv s1, a0 27489; RV32I-NEXT: lw a4, 0(a0) 27490; RV32I-NEXT: lw a5, 4(a0) 27491; RV32I-NEXT: mv s2, a1 27492; RV32I-NEXT: j .LBB229_2 27493; RV32I-NEXT: .LBB229_1: # %atomicrmw.start 27494; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1 27495; RV32I-NEXT: sw a4, 8(sp) 27496; RV32I-NEXT: sw a5, 12(sp) 27497; RV32I-NEXT: addi a1, sp, 8 27498; RV32I-NEXT: li a4, 5 27499; RV32I-NEXT: li a5, 5 27500; RV32I-NEXT: mv a0, s1 27501; RV32I-NEXT: call __atomic_compare_exchange_8 27502; RV32I-NEXT: lw a4, 8(sp) 27503; RV32I-NEXT: lw a5, 12(sp) 27504; RV32I-NEXT: bnez a0, .LBB229_7 27505; RV32I-NEXT: .LBB229_2: # %atomicrmw.start 27506; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27507; RV32I-NEXT: beq a5, s0, .LBB229_4 27508; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27509; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1 27510; RV32I-NEXT: slt a0, s0, a5 27511; RV32I-NEXT: j .LBB229_5 27512; RV32I-NEXT: .LBB229_4: # in Loop: Header=BB229_2 Depth=1 27513; RV32I-NEXT: sltu a0, s2, a4 27514; RV32I-NEXT: .LBB229_5: # %atomicrmw.start 27515; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1 27516; RV32I-NEXT: mv a2, a4 27517; RV32I-NEXT: mv a3, a5 27518; RV32I-NEXT: beqz a0, .LBB229_1 27519; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27520; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1 27521; RV32I-NEXT: mv a2, s2 27522; RV32I-NEXT: mv a3, s0 27523; RV32I-NEXT: j .LBB229_1 27524; RV32I-NEXT: .LBB229_7: # %atomicrmw.end 27525; RV32I-NEXT: mv a0, a4 27526; RV32I-NEXT: mv a1, a5 27527; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27528; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27529; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27530; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27531; RV32I-NEXT: addi sp, sp, 32 27532; RV32I-NEXT: ret 27533; 27534; RV32IA-LABEL: atomicrmw_min_i64_seq_cst: 27535; RV32IA: # %bb.0: 27536; RV32IA-NEXT: addi sp, sp, -32 27537; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27538; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27539; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27540; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27541; RV32IA-NEXT: mv s0, a2 27542; RV32IA-NEXT: mv s1, a0 27543; RV32IA-NEXT: lw a4, 0(a0) 27544; RV32IA-NEXT: lw a5, 4(a0) 27545; RV32IA-NEXT: mv s2, a1 27546; RV32IA-NEXT: j .LBB229_2 27547; RV32IA-NEXT: .LBB229_1: # %atomicrmw.start 27548; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1 27549; RV32IA-NEXT: sw a4, 8(sp) 27550; RV32IA-NEXT: sw a5, 12(sp) 27551; RV32IA-NEXT: addi a1, sp, 8 27552; RV32IA-NEXT: li a4, 5 27553; RV32IA-NEXT: li a5, 5 27554; RV32IA-NEXT: mv a0, s1 27555; RV32IA-NEXT: call __atomic_compare_exchange_8 27556; RV32IA-NEXT: lw a4, 8(sp) 27557; RV32IA-NEXT: lw a5, 12(sp) 27558; RV32IA-NEXT: bnez a0, .LBB229_7 27559; RV32IA-NEXT: .LBB229_2: # %atomicrmw.start 27560; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 27561; RV32IA-NEXT: beq a5, s0, .LBB229_4 27562; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 27563; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1 27564; RV32IA-NEXT: slt a0, s0, a5 27565; RV32IA-NEXT: j .LBB229_5 27566; RV32IA-NEXT: .LBB229_4: # in Loop: Header=BB229_2 Depth=1 27567; RV32IA-NEXT: sltu a0, s2, a4 27568; RV32IA-NEXT: .LBB229_5: # %atomicrmw.start 27569; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1 27570; RV32IA-NEXT: mv a2, a4 27571; RV32IA-NEXT: mv a3, a5 27572; RV32IA-NEXT: beqz a0, .LBB229_1 27573; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 27574; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1 27575; RV32IA-NEXT: mv a2, s2 27576; RV32IA-NEXT: mv a3, s0 27577; RV32IA-NEXT: j .LBB229_1 27578; RV32IA-NEXT: .LBB229_7: # %atomicrmw.end 27579; RV32IA-NEXT: mv a0, a4 27580; RV32IA-NEXT: mv a1, a5 27581; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27582; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27583; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27584; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27585; RV32IA-NEXT: addi sp, sp, 32 27586; RV32IA-NEXT: ret 27587; 27588; RV64I-LABEL: atomicrmw_min_i64_seq_cst: 27589; RV64I: # %bb.0: 27590; RV64I-NEXT: addi sp, sp, -32 27591; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 27592; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 27593; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 27594; RV64I-NEXT: mv s0, a0 27595; RV64I-NEXT: ld a3, 0(a0) 27596; RV64I-NEXT: mv s1, a1 27597; RV64I-NEXT: j .LBB229_2 27598; RV64I-NEXT: .LBB229_1: # %atomicrmw.start 27599; RV64I-NEXT: # in Loop: Header=BB229_2 Depth=1 27600; RV64I-NEXT: sd a3, 0(sp) 27601; RV64I-NEXT: mv a1, sp 27602; RV64I-NEXT: li a3, 5 27603; RV64I-NEXT: li a4, 5 27604; RV64I-NEXT: mv a0, s0 27605; RV64I-NEXT: call __atomic_compare_exchange_8 27606; RV64I-NEXT: ld a3, 0(sp) 27607; RV64I-NEXT: bnez a0, .LBB229_4 27608; RV64I-NEXT: .LBB229_2: # %atomicrmw.start 27609; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 27610; RV64I-NEXT: mv a2, a3 27611; RV64I-NEXT: bge s1, a3, .LBB229_1 27612; RV64I-NEXT: # %bb.3: # %atomicrmw.start 27613; RV64I-NEXT: # in Loop: Header=BB229_2 Depth=1 27614; RV64I-NEXT: mv a2, s1 27615; RV64I-NEXT: j .LBB229_1 27616; RV64I-NEXT: .LBB229_4: # %atomicrmw.end 27617; RV64I-NEXT: mv a0, a3 27618; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 27619; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 27620; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 27621; RV64I-NEXT: addi sp, sp, 32 27622; RV64I-NEXT: ret 27623; 27624; RV64IA-WMO-LABEL: atomicrmw_min_i64_seq_cst: 27625; RV64IA-WMO: # %bb.0: 27626; RV64IA-WMO-NEXT: amomin.d.aqrl a0, a1, (a0) 27627; RV64IA-WMO-NEXT: ret 27628; 27629; RV64IA-TSO-LABEL: atomicrmw_min_i64_seq_cst: 27630; RV64IA-TSO: # %bb.0: 27631; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0) 27632; RV64IA-TSO-NEXT: ret 27633 %1 = atomicrmw min ptr %a, i64 %b seq_cst 27634 ret i64 %1 27635} 27636 27637define i64 @atomicrmw_umax_i64_monotonic(ptr %a, i64 %b) nounwind { 27638; RV32I-LABEL: atomicrmw_umax_i64_monotonic: 27639; RV32I: # %bb.0: 27640; RV32I-NEXT: addi sp, sp, -32 27641; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27642; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27643; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27644; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27645; RV32I-NEXT: mv s0, a2 27646; RV32I-NEXT: mv s1, a0 27647; RV32I-NEXT: lw a4, 0(a0) 27648; RV32I-NEXT: lw a5, 4(a0) 27649; RV32I-NEXT: mv s2, a1 27650; RV32I-NEXT: j .LBB230_2 27651; RV32I-NEXT: .LBB230_1: # %atomicrmw.start 27652; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1 27653; RV32I-NEXT: sw a4, 8(sp) 27654; RV32I-NEXT: sw a5, 12(sp) 27655; RV32I-NEXT: addi a1, sp, 8 27656; RV32I-NEXT: mv a0, s1 27657; RV32I-NEXT: li a4, 0 27658; RV32I-NEXT: li a5, 0 27659; RV32I-NEXT: call __atomic_compare_exchange_8 27660; RV32I-NEXT: lw a4, 8(sp) 27661; RV32I-NEXT: lw a5, 12(sp) 27662; RV32I-NEXT: bnez a0, .LBB230_7 27663; RV32I-NEXT: .LBB230_2: # %atomicrmw.start 27664; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27665; RV32I-NEXT: beq a5, s0, .LBB230_4 27666; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27667; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1 27668; RV32I-NEXT: sltu a0, s0, a5 27669; RV32I-NEXT: j .LBB230_5 27670; RV32I-NEXT: .LBB230_4: # in Loop: Header=BB230_2 Depth=1 27671; RV32I-NEXT: sltu a0, s2, a4 27672; RV32I-NEXT: .LBB230_5: # %atomicrmw.start 27673; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1 27674; RV32I-NEXT: mv a2, a4 27675; RV32I-NEXT: mv a3, a5 27676; RV32I-NEXT: bnez a0, .LBB230_1 27677; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27678; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1 27679; RV32I-NEXT: mv a2, s2 27680; RV32I-NEXT: mv a3, s0 27681; RV32I-NEXT: j .LBB230_1 27682; RV32I-NEXT: .LBB230_7: # %atomicrmw.end 27683; RV32I-NEXT: mv a0, a4 27684; RV32I-NEXT: mv a1, a5 27685; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27686; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27687; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27688; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27689; RV32I-NEXT: addi sp, sp, 32 27690; RV32I-NEXT: ret 27691; 27692; RV32IA-LABEL: atomicrmw_umax_i64_monotonic: 27693; RV32IA: # %bb.0: 27694; RV32IA-NEXT: addi sp, sp, -32 27695; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27696; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27697; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27698; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27699; RV32IA-NEXT: mv s0, a2 27700; RV32IA-NEXT: mv s1, a0 27701; RV32IA-NEXT: lw a4, 0(a0) 27702; RV32IA-NEXT: lw a5, 4(a0) 27703; RV32IA-NEXT: mv s2, a1 27704; RV32IA-NEXT: j .LBB230_2 27705; RV32IA-NEXT: .LBB230_1: # %atomicrmw.start 27706; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1 27707; RV32IA-NEXT: sw a4, 8(sp) 27708; RV32IA-NEXT: sw a5, 12(sp) 27709; RV32IA-NEXT: addi a1, sp, 8 27710; RV32IA-NEXT: mv a0, s1 27711; RV32IA-NEXT: li a4, 0 27712; RV32IA-NEXT: li a5, 0 27713; RV32IA-NEXT: call __atomic_compare_exchange_8 27714; RV32IA-NEXT: lw a4, 8(sp) 27715; RV32IA-NEXT: lw a5, 12(sp) 27716; RV32IA-NEXT: bnez a0, .LBB230_7 27717; RV32IA-NEXT: .LBB230_2: # %atomicrmw.start 27718; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 27719; RV32IA-NEXT: beq a5, s0, .LBB230_4 27720; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 27721; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1 27722; RV32IA-NEXT: sltu a0, s0, a5 27723; RV32IA-NEXT: j .LBB230_5 27724; RV32IA-NEXT: .LBB230_4: # in Loop: Header=BB230_2 Depth=1 27725; RV32IA-NEXT: sltu a0, s2, a4 27726; RV32IA-NEXT: .LBB230_5: # %atomicrmw.start 27727; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1 27728; RV32IA-NEXT: mv a2, a4 27729; RV32IA-NEXT: mv a3, a5 27730; RV32IA-NEXT: bnez a0, .LBB230_1 27731; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 27732; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1 27733; RV32IA-NEXT: mv a2, s2 27734; RV32IA-NEXT: mv a3, s0 27735; RV32IA-NEXT: j .LBB230_1 27736; RV32IA-NEXT: .LBB230_7: # %atomicrmw.end 27737; RV32IA-NEXT: mv a0, a4 27738; RV32IA-NEXT: mv a1, a5 27739; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27740; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27741; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27742; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27743; RV32IA-NEXT: addi sp, sp, 32 27744; RV32IA-NEXT: ret 27745; 27746; RV64I-LABEL: atomicrmw_umax_i64_monotonic: 27747; RV64I: # %bb.0: 27748; RV64I-NEXT: addi sp, sp, -32 27749; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 27750; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 27751; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 27752; RV64I-NEXT: mv s0, a0 27753; RV64I-NEXT: ld a3, 0(a0) 27754; RV64I-NEXT: mv s1, a1 27755; RV64I-NEXT: j .LBB230_2 27756; RV64I-NEXT: .LBB230_1: # %atomicrmw.start 27757; RV64I-NEXT: # in Loop: Header=BB230_2 Depth=1 27758; RV64I-NEXT: sd a3, 0(sp) 27759; RV64I-NEXT: mv a1, sp 27760; RV64I-NEXT: mv a0, s0 27761; RV64I-NEXT: li a3, 0 27762; RV64I-NEXT: li a4, 0 27763; RV64I-NEXT: call __atomic_compare_exchange_8 27764; RV64I-NEXT: ld a3, 0(sp) 27765; RV64I-NEXT: bnez a0, .LBB230_4 27766; RV64I-NEXT: .LBB230_2: # %atomicrmw.start 27767; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 27768; RV64I-NEXT: mv a2, a3 27769; RV64I-NEXT: bltu s1, a3, .LBB230_1 27770; RV64I-NEXT: # %bb.3: # %atomicrmw.start 27771; RV64I-NEXT: # in Loop: Header=BB230_2 Depth=1 27772; RV64I-NEXT: mv a2, s1 27773; RV64I-NEXT: j .LBB230_1 27774; RV64I-NEXT: .LBB230_4: # %atomicrmw.end 27775; RV64I-NEXT: mv a0, a3 27776; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 27777; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 27778; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 27779; RV64I-NEXT: addi sp, sp, 32 27780; RV64I-NEXT: ret 27781; 27782; RV64IA-LABEL: atomicrmw_umax_i64_monotonic: 27783; RV64IA: # %bb.0: 27784; RV64IA-NEXT: amomaxu.d a0, a1, (a0) 27785; RV64IA-NEXT: ret 27786 %1 = atomicrmw umax ptr %a, i64 %b monotonic 27787 ret i64 %1 27788} 27789 27790define i64 @atomicrmw_umax_i64_acquire(ptr %a, i64 %b) nounwind { 27791; RV32I-LABEL: atomicrmw_umax_i64_acquire: 27792; RV32I: # %bb.0: 27793; RV32I-NEXT: addi sp, sp, -32 27794; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27795; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27796; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27797; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27798; RV32I-NEXT: mv s0, a2 27799; RV32I-NEXT: mv s1, a0 27800; RV32I-NEXT: lw a4, 0(a0) 27801; RV32I-NEXT: lw a5, 4(a0) 27802; RV32I-NEXT: mv s2, a1 27803; RV32I-NEXT: j .LBB231_2 27804; RV32I-NEXT: .LBB231_1: # %atomicrmw.start 27805; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1 27806; RV32I-NEXT: sw a4, 8(sp) 27807; RV32I-NEXT: sw a5, 12(sp) 27808; RV32I-NEXT: addi a1, sp, 8 27809; RV32I-NEXT: li a4, 2 27810; RV32I-NEXT: li a5, 2 27811; RV32I-NEXT: mv a0, s1 27812; RV32I-NEXT: call __atomic_compare_exchange_8 27813; RV32I-NEXT: lw a4, 8(sp) 27814; RV32I-NEXT: lw a5, 12(sp) 27815; RV32I-NEXT: bnez a0, .LBB231_7 27816; RV32I-NEXT: .LBB231_2: # %atomicrmw.start 27817; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27818; RV32I-NEXT: beq a5, s0, .LBB231_4 27819; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27820; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1 27821; RV32I-NEXT: sltu a0, s0, a5 27822; RV32I-NEXT: j .LBB231_5 27823; RV32I-NEXT: .LBB231_4: # in Loop: Header=BB231_2 Depth=1 27824; RV32I-NEXT: sltu a0, s2, a4 27825; RV32I-NEXT: .LBB231_5: # %atomicrmw.start 27826; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1 27827; RV32I-NEXT: mv a2, a4 27828; RV32I-NEXT: mv a3, a5 27829; RV32I-NEXT: bnez a0, .LBB231_1 27830; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27831; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1 27832; RV32I-NEXT: mv a2, s2 27833; RV32I-NEXT: mv a3, s0 27834; RV32I-NEXT: j .LBB231_1 27835; RV32I-NEXT: .LBB231_7: # %atomicrmw.end 27836; RV32I-NEXT: mv a0, a4 27837; RV32I-NEXT: mv a1, a5 27838; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27839; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27840; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27841; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27842; RV32I-NEXT: addi sp, sp, 32 27843; RV32I-NEXT: ret 27844; 27845; RV32IA-LABEL: atomicrmw_umax_i64_acquire: 27846; RV32IA: # %bb.0: 27847; RV32IA-NEXT: addi sp, sp, -32 27848; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27849; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27850; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27851; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27852; RV32IA-NEXT: mv s0, a2 27853; RV32IA-NEXT: mv s1, a0 27854; RV32IA-NEXT: lw a4, 0(a0) 27855; RV32IA-NEXT: lw a5, 4(a0) 27856; RV32IA-NEXT: mv s2, a1 27857; RV32IA-NEXT: j .LBB231_2 27858; RV32IA-NEXT: .LBB231_1: # %atomicrmw.start 27859; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1 27860; RV32IA-NEXT: sw a4, 8(sp) 27861; RV32IA-NEXT: sw a5, 12(sp) 27862; RV32IA-NEXT: addi a1, sp, 8 27863; RV32IA-NEXT: li a4, 2 27864; RV32IA-NEXT: li a5, 2 27865; RV32IA-NEXT: mv a0, s1 27866; RV32IA-NEXT: call __atomic_compare_exchange_8 27867; RV32IA-NEXT: lw a4, 8(sp) 27868; RV32IA-NEXT: lw a5, 12(sp) 27869; RV32IA-NEXT: bnez a0, .LBB231_7 27870; RV32IA-NEXT: .LBB231_2: # %atomicrmw.start 27871; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 27872; RV32IA-NEXT: beq a5, s0, .LBB231_4 27873; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 27874; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1 27875; RV32IA-NEXT: sltu a0, s0, a5 27876; RV32IA-NEXT: j .LBB231_5 27877; RV32IA-NEXT: .LBB231_4: # in Loop: Header=BB231_2 Depth=1 27878; RV32IA-NEXT: sltu a0, s2, a4 27879; RV32IA-NEXT: .LBB231_5: # %atomicrmw.start 27880; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1 27881; RV32IA-NEXT: mv a2, a4 27882; RV32IA-NEXT: mv a3, a5 27883; RV32IA-NEXT: bnez a0, .LBB231_1 27884; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 27885; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1 27886; RV32IA-NEXT: mv a2, s2 27887; RV32IA-NEXT: mv a3, s0 27888; RV32IA-NEXT: j .LBB231_1 27889; RV32IA-NEXT: .LBB231_7: # %atomicrmw.end 27890; RV32IA-NEXT: mv a0, a4 27891; RV32IA-NEXT: mv a1, a5 27892; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27893; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27894; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27895; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 27896; RV32IA-NEXT: addi sp, sp, 32 27897; RV32IA-NEXT: ret 27898; 27899; RV64I-LABEL: atomicrmw_umax_i64_acquire: 27900; RV64I: # %bb.0: 27901; RV64I-NEXT: addi sp, sp, -32 27902; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 27903; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 27904; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 27905; RV64I-NEXT: mv s0, a0 27906; RV64I-NEXT: ld a3, 0(a0) 27907; RV64I-NEXT: mv s1, a1 27908; RV64I-NEXT: j .LBB231_2 27909; RV64I-NEXT: .LBB231_1: # %atomicrmw.start 27910; RV64I-NEXT: # in Loop: Header=BB231_2 Depth=1 27911; RV64I-NEXT: sd a3, 0(sp) 27912; RV64I-NEXT: mv a1, sp 27913; RV64I-NEXT: li a3, 2 27914; RV64I-NEXT: li a4, 2 27915; RV64I-NEXT: mv a0, s0 27916; RV64I-NEXT: call __atomic_compare_exchange_8 27917; RV64I-NEXT: ld a3, 0(sp) 27918; RV64I-NEXT: bnez a0, .LBB231_4 27919; RV64I-NEXT: .LBB231_2: # %atomicrmw.start 27920; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 27921; RV64I-NEXT: mv a2, a3 27922; RV64I-NEXT: bltu s1, a3, .LBB231_1 27923; RV64I-NEXT: # %bb.3: # %atomicrmw.start 27924; RV64I-NEXT: # in Loop: Header=BB231_2 Depth=1 27925; RV64I-NEXT: mv a2, s1 27926; RV64I-NEXT: j .LBB231_1 27927; RV64I-NEXT: .LBB231_4: # %atomicrmw.end 27928; RV64I-NEXT: mv a0, a3 27929; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 27930; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 27931; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 27932; RV64I-NEXT: addi sp, sp, 32 27933; RV64I-NEXT: ret 27934; 27935; RV64IA-WMO-LABEL: atomicrmw_umax_i64_acquire: 27936; RV64IA-WMO: # %bb.0: 27937; RV64IA-WMO-NEXT: amomaxu.d.aq a0, a1, (a0) 27938; RV64IA-WMO-NEXT: ret 27939; 27940; RV64IA-TSO-LABEL: atomicrmw_umax_i64_acquire: 27941; RV64IA-TSO: # %bb.0: 27942; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0) 27943; RV64IA-TSO-NEXT: ret 27944 %1 = atomicrmw umax ptr %a, i64 %b acquire 27945 ret i64 %1 27946} 27947 27948define i64 @atomicrmw_umax_i64_release(ptr %a, i64 %b) nounwind { 27949; RV32I-LABEL: atomicrmw_umax_i64_release: 27950; RV32I: # %bb.0: 27951; RV32I-NEXT: addi sp, sp, -32 27952; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 27953; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 27954; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 27955; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 27956; RV32I-NEXT: mv s0, a2 27957; RV32I-NEXT: mv s1, a0 27958; RV32I-NEXT: lw a4, 0(a0) 27959; RV32I-NEXT: lw a5, 4(a0) 27960; RV32I-NEXT: mv s2, a1 27961; RV32I-NEXT: j .LBB232_2 27962; RV32I-NEXT: .LBB232_1: # %atomicrmw.start 27963; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1 27964; RV32I-NEXT: sw a4, 8(sp) 27965; RV32I-NEXT: sw a5, 12(sp) 27966; RV32I-NEXT: addi a1, sp, 8 27967; RV32I-NEXT: li a4, 3 27968; RV32I-NEXT: mv a0, s1 27969; RV32I-NEXT: li a5, 0 27970; RV32I-NEXT: call __atomic_compare_exchange_8 27971; RV32I-NEXT: lw a4, 8(sp) 27972; RV32I-NEXT: lw a5, 12(sp) 27973; RV32I-NEXT: bnez a0, .LBB232_7 27974; RV32I-NEXT: .LBB232_2: # %atomicrmw.start 27975; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 27976; RV32I-NEXT: beq a5, s0, .LBB232_4 27977; RV32I-NEXT: # %bb.3: # %atomicrmw.start 27978; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1 27979; RV32I-NEXT: sltu a0, s0, a5 27980; RV32I-NEXT: j .LBB232_5 27981; RV32I-NEXT: .LBB232_4: # in Loop: Header=BB232_2 Depth=1 27982; RV32I-NEXT: sltu a0, s2, a4 27983; RV32I-NEXT: .LBB232_5: # %atomicrmw.start 27984; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1 27985; RV32I-NEXT: mv a2, a4 27986; RV32I-NEXT: mv a3, a5 27987; RV32I-NEXT: bnez a0, .LBB232_1 27988; RV32I-NEXT: # %bb.6: # %atomicrmw.start 27989; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1 27990; RV32I-NEXT: mv a2, s2 27991; RV32I-NEXT: mv a3, s0 27992; RV32I-NEXT: j .LBB232_1 27993; RV32I-NEXT: .LBB232_7: # %atomicrmw.end 27994; RV32I-NEXT: mv a0, a4 27995; RV32I-NEXT: mv a1, a5 27996; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 27997; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 27998; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 27999; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28000; RV32I-NEXT: addi sp, sp, 32 28001; RV32I-NEXT: ret 28002; 28003; RV32IA-LABEL: atomicrmw_umax_i64_release: 28004; RV32IA: # %bb.0: 28005; RV32IA-NEXT: addi sp, sp, -32 28006; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28007; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28008; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28009; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28010; RV32IA-NEXT: mv s0, a2 28011; RV32IA-NEXT: mv s1, a0 28012; RV32IA-NEXT: lw a4, 0(a0) 28013; RV32IA-NEXT: lw a5, 4(a0) 28014; RV32IA-NEXT: mv s2, a1 28015; RV32IA-NEXT: j .LBB232_2 28016; RV32IA-NEXT: .LBB232_1: # %atomicrmw.start 28017; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1 28018; RV32IA-NEXT: sw a4, 8(sp) 28019; RV32IA-NEXT: sw a5, 12(sp) 28020; RV32IA-NEXT: addi a1, sp, 8 28021; RV32IA-NEXT: li a4, 3 28022; RV32IA-NEXT: mv a0, s1 28023; RV32IA-NEXT: li a5, 0 28024; RV32IA-NEXT: call __atomic_compare_exchange_8 28025; RV32IA-NEXT: lw a4, 8(sp) 28026; RV32IA-NEXT: lw a5, 12(sp) 28027; RV32IA-NEXT: bnez a0, .LBB232_7 28028; RV32IA-NEXT: .LBB232_2: # %atomicrmw.start 28029; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28030; RV32IA-NEXT: beq a5, s0, .LBB232_4 28031; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28032; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1 28033; RV32IA-NEXT: sltu a0, s0, a5 28034; RV32IA-NEXT: j .LBB232_5 28035; RV32IA-NEXT: .LBB232_4: # in Loop: Header=BB232_2 Depth=1 28036; RV32IA-NEXT: sltu a0, s2, a4 28037; RV32IA-NEXT: .LBB232_5: # %atomicrmw.start 28038; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1 28039; RV32IA-NEXT: mv a2, a4 28040; RV32IA-NEXT: mv a3, a5 28041; RV32IA-NEXT: bnez a0, .LBB232_1 28042; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28043; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1 28044; RV32IA-NEXT: mv a2, s2 28045; RV32IA-NEXT: mv a3, s0 28046; RV32IA-NEXT: j .LBB232_1 28047; RV32IA-NEXT: .LBB232_7: # %atomicrmw.end 28048; RV32IA-NEXT: mv a0, a4 28049; RV32IA-NEXT: mv a1, a5 28050; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28051; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28052; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28053; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28054; RV32IA-NEXT: addi sp, sp, 32 28055; RV32IA-NEXT: ret 28056; 28057; RV64I-LABEL: atomicrmw_umax_i64_release: 28058; RV64I: # %bb.0: 28059; RV64I-NEXT: addi sp, sp, -32 28060; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 28061; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 28062; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 28063; RV64I-NEXT: mv s0, a0 28064; RV64I-NEXT: ld a3, 0(a0) 28065; RV64I-NEXT: mv s1, a1 28066; RV64I-NEXT: j .LBB232_2 28067; RV64I-NEXT: .LBB232_1: # %atomicrmw.start 28068; RV64I-NEXT: # in Loop: Header=BB232_2 Depth=1 28069; RV64I-NEXT: sd a3, 0(sp) 28070; RV64I-NEXT: mv a1, sp 28071; RV64I-NEXT: li a3, 3 28072; RV64I-NEXT: mv a0, s0 28073; RV64I-NEXT: li a4, 0 28074; RV64I-NEXT: call __atomic_compare_exchange_8 28075; RV64I-NEXT: ld a3, 0(sp) 28076; RV64I-NEXT: bnez a0, .LBB232_4 28077; RV64I-NEXT: .LBB232_2: # %atomicrmw.start 28078; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 28079; RV64I-NEXT: mv a2, a3 28080; RV64I-NEXT: bltu s1, a3, .LBB232_1 28081; RV64I-NEXT: # %bb.3: # %atomicrmw.start 28082; RV64I-NEXT: # in Loop: Header=BB232_2 Depth=1 28083; RV64I-NEXT: mv a2, s1 28084; RV64I-NEXT: j .LBB232_1 28085; RV64I-NEXT: .LBB232_4: # %atomicrmw.end 28086; RV64I-NEXT: mv a0, a3 28087; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 28088; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 28089; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 28090; RV64I-NEXT: addi sp, sp, 32 28091; RV64I-NEXT: ret 28092; 28093; RV64IA-WMO-LABEL: atomicrmw_umax_i64_release: 28094; RV64IA-WMO: # %bb.0: 28095; RV64IA-WMO-NEXT: amomaxu.d.rl a0, a1, (a0) 28096; RV64IA-WMO-NEXT: ret 28097; 28098; RV64IA-TSO-LABEL: atomicrmw_umax_i64_release: 28099; RV64IA-TSO: # %bb.0: 28100; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0) 28101; RV64IA-TSO-NEXT: ret 28102 %1 = atomicrmw umax ptr %a, i64 %b release 28103 ret i64 %1 28104} 28105 28106define i64 @atomicrmw_umax_i64_acq_rel(ptr %a, i64 %b) nounwind { 28107; RV32I-LABEL: atomicrmw_umax_i64_acq_rel: 28108; RV32I: # %bb.0: 28109; RV32I-NEXT: addi sp, sp, -32 28110; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28111; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28112; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28113; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28114; RV32I-NEXT: mv s0, a2 28115; RV32I-NEXT: mv s1, a0 28116; RV32I-NEXT: lw a4, 0(a0) 28117; RV32I-NEXT: lw a5, 4(a0) 28118; RV32I-NEXT: mv s2, a1 28119; RV32I-NEXT: j .LBB233_2 28120; RV32I-NEXT: .LBB233_1: # %atomicrmw.start 28121; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1 28122; RV32I-NEXT: sw a4, 8(sp) 28123; RV32I-NEXT: sw a5, 12(sp) 28124; RV32I-NEXT: addi a1, sp, 8 28125; RV32I-NEXT: li a4, 4 28126; RV32I-NEXT: li a5, 2 28127; RV32I-NEXT: mv a0, s1 28128; RV32I-NEXT: call __atomic_compare_exchange_8 28129; RV32I-NEXT: lw a4, 8(sp) 28130; RV32I-NEXT: lw a5, 12(sp) 28131; RV32I-NEXT: bnez a0, .LBB233_7 28132; RV32I-NEXT: .LBB233_2: # %atomicrmw.start 28133; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 28134; RV32I-NEXT: beq a5, s0, .LBB233_4 28135; RV32I-NEXT: # %bb.3: # %atomicrmw.start 28136; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1 28137; RV32I-NEXT: sltu a0, s0, a5 28138; RV32I-NEXT: j .LBB233_5 28139; RV32I-NEXT: .LBB233_4: # in Loop: Header=BB233_2 Depth=1 28140; RV32I-NEXT: sltu a0, s2, a4 28141; RV32I-NEXT: .LBB233_5: # %atomicrmw.start 28142; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1 28143; RV32I-NEXT: mv a2, a4 28144; RV32I-NEXT: mv a3, a5 28145; RV32I-NEXT: bnez a0, .LBB233_1 28146; RV32I-NEXT: # %bb.6: # %atomicrmw.start 28147; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1 28148; RV32I-NEXT: mv a2, s2 28149; RV32I-NEXT: mv a3, s0 28150; RV32I-NEXT: j .LBB233_1 28151; RV32I-NEXT: .LBB233_7: # %atomicrmw.end 28152; RV32I-NEXT: mv a0, a4 28153; RV32I-NEXT: mv a1, a5 28154; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28155; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28156; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28157; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28158; RV32I-NEXT: addi sp, sp, 32 28159; RV32I-NEXT: ret 28160; 28161; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel: 28162; RV32IA: # %bb.0: 28163; RV32IA-NEXT: addi sp, sp, -32 28164; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28165; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28166; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28167; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28168; RV32IA-NEXT: mv s0, a2 28169; RV32IA-NEXT: mv s1, a0 28170; RV32IA-NEXT: lw a4, 0(a0) 28171; RV32IA-NEXT: lw a5, 4(a0) 28172; RV32IA-NEXT: mv s2, a1 28173; RV32IA-NEXT: j .LBB233_2 28174; RV32IA-NEXT: .LBB233_1: # %atomicrmw.start 28175; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1 28176; RV32IA-NEXT: sw a4, 8(sp) 28177; RV32IA-NEXT: sw a5, 12(sp) 28178; RV32IA-NEXT: addi a1, sp, 8 28179; RV32IA-NEXT: li a4, 4 28180; RV32IA-NEXT: li a5, 2 28181; RV32IA-NEXT: mv a0, s1 28182; RV32IA-NEXT: call __atomic_compare_exchange_8 28183; RV32IA-NEXT: lw a4, 8(sp) 28184; RV32IA-NEXT: lw a5, 12(sp) 28185; RV32IA-NEXT: bnez a0, .LBB233_7 28186; RV32IA-NEXT: .LBB233_2: # %atomicrmw.start 28187; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28188; RV32IA-NEXT: beq a5, s0, .LBB233_4 28189; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28190; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1 28191; RV32IA-NEXT: sltu a0, s0, a5 28192; RV32IA-NEXT: j .LBB233_5 28193; RV32IA-NEXT: .LBB233_4: # in Loop: Header=BB233_2 Depth=1 28194; RV32IA-NEXT: sltu a0, s2, a4 28195; RV32IA-NEXT: .LBB233_5: # %atomicrmw.start 28196; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1 28197; RV32IA-NEXT: mv a2, a4 28198; RV32IA-NEXT: mv a3, a5 28199; RV32IA-NEXT: bnez a0, .LBB233_1 28200; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28201; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1 28202; RV32IA-NEXT: mv a2, s2 28203; RV32IA-NEXT: mv a3, s0 28204; RV32IA-NEXT: j .LBB233_1 28205; RV32IA-NEXT: .LBB233_7: # %atomicrmw.end 28206; RV32IA-NEXT: mv a0, a4 28207; RV32IA-NEXT: mv a1, a5 28208; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28209; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28210; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28211; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28212; RV32IA-NEXT: addi sp, sp, 32 28213; RV32IA-NEXT: ret 28214; 28215; RV64I-LABEL: atomicrmw_umax_i64_acq_rel: 28216; RV64I: # %bb.0: 28217; RV64I-NEXT: addi sp, sp, -32 28218; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 28219; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 28220; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 28221; RV64I-NEXT: mv s0, a0 28222; RV64I-NEXT: ld a3, 0(a0) 28223; RV64I-NEXT: mv s1, a1 28224; RV64I-NEXT: j .LBB233_2 28225; RV64I-NEXT: .LBB233_1: # %atomicrmw.start 28226; RV64I-NEXT: # in Loop: Header=BB233_2 Depth=1 28227; RV64I-NEXT: sd a3, 0(sp) 28228; RV64I-NEXT: mv a1, sp 28229; RV64I-NEXT: li a3, 4 28230; RV64I-NEXT: li a4, 2 28231; RV64I-NEXT: mv a0, s0 28232; RV64I-NEXT: call __atomic_compare_exchange_8 28233; RV64I-NEXT: ld a3, 0(sp) 28234; RV64I-NEXT: bnez a0, .LBB233_4 28235; RV64I-NEXT: .LBB233_2: # %atomicrmw.start 28236; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 28237; RV64I-NEXT: mv a2, a3 28238; RV64I-NEXT: bltu s1, a3, .LBB233_1 28239; RV64I-NEXT: # %bb.3: # %atomicrmw.start 28240; RV64I-NEXT: # in Loop: Header=BB233_2 Depth=1 28241; RV64I-NEXT: mv a2, s1 28242; RV64I-NEXT: j .LBB233_1 28243; RV64I-NEXT: .LBB233_4: # %atomicrmw.end 28244; RV64I-NEXT: mv a0, a3 28245; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 28246; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 28247; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 28248; RV64I-NEXT: addi sp, sp, 32 28249; RV64I-NEXT: ret 28250; 28251; RV64IA-WMO-LABEL: atomicrmw_umax_i64_acq_rel: 28252; RV64IA-WMO: # %bb.0: 28253; RV64IA-WMO-NEXT: amomaxu.d.aqrl a0, a1, (a0) 28254; RV64IA-WMO-NEXT: ret 28255; 28256; RV64IA-TSO-LABEL: atomicrmw_umax_i64_acq_rel: 28257; RV64IA-TSO: # %bb.0: 28258; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0) 28259; RV64IA-TSO-NEXT: ret 28260 %1 = atomicrmw umax ptr %a, i64 %b acq_rel 28261 ret i64 %1 28262} 28263 28264define i64 @atomicrmw_umax_i64_seq_cst(ptr %a, i64 %b) nounwind { 28265; RV32I-LABEL: atomicrmw_umax_i64_seq_cst: 28266; RV32I: # %bb.0: 28267; RV32I-NEXT: addi sp, sp, -32 28268; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28269; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28270; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28271; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28272; RV32I-NEXT: mv s0, a2 28273; RV32I-NEXT: mv s1, a0 28274; RV32I-NEXT: lw a4, 0(a0) 28275; RV32I-NEXT: lw a5, 4(a0) 28276; RV32I-NEXT: mv s2, a1 28277; RV32I-NEXT: j .LBB234_2 28278; RV32I-NEXT: .LBB234_1: # %atomicrmw.start 28279; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1 28280; RV32I-NEXT: sw a4, 8(sp) 28281; RV32I-NEXT: sw a5, 12(sp) 28282; RV32I-NEXT: addi a1, sp, 8 28283; RV32I-NEXT: li a4, 5 28284; RV32I-NEXT: li a5, 5 28285; RV32I-NEXT: mv a0, s1 28286; RV32I-NEXT: call __atomic_compare_exchange_8 28287; RV32I-NEXT: lw a4, 8(sp) 28288; RV32I-NEXT: lw a5, 12(sp) 28289; RV32I-NEXT: bnez a0, .LBB234_7 28290; RV32I-NEXT: .LBB234_2: # %atomicrmw.start 28291; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 28292; RV32I-NEXT: beq a5, s0, .LBB234_4 28293; RV32I-NEXT: # %bb.3: # %atomicrmw.start 28294; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1 28295; RV32I-NEXT: sltu a0, s0, a5 28296; RV32I-NEXT: j .LBB234_5 28297; RV32I-NEXT: .LBB234_4: # in Loop: Header=BB234_2 Depth=1 28298; RV32I-NEXT: sltu a0, s2, a4 28299; RV32I-NEXT: .LBB234_5: # %atomicrmw.start 28300; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1 28301; RV32I-NEXT: mv a2, a4 28302; RV32I-NEXT: mv a3, a5 28303; RV32I-NEXT: bnez a0, .LBB234_1 28304; RV32I-NEXT: # %bb.6: # %atomicrmw.start 28305; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1 28306; RV32I-NEXT: mv a2, s2 28307; RV32I-NEXT: mv a3, s0 28308; RV32I-NEXT: j .LBB234_1 28309; RV32I-NEXT: .LBB234_7: # %atomicrmw.end 28310; RV32I-NEXT: mv a0, a4 28311; RV32I-NEXT: mv a1, a5 28312; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28313; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28314; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28315; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28316; RV32I-NEXT: addi sp, sp, 32 28317; RV32I-NEXT: ret 28318; 28319; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst: 28320; RV32IA: # %bb.0: 28321; RV32IA-NEXT: addi sp, sp, -32 28322; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28323; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28324; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28325; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28326; RV32IA-NEXT: mv s0, a2 28327; RV32IA-NEXT: mv s1, a0 28328; RV32IA-NEXT: lw a4, 0(a0) 28329; RV32IA-NEXT: lw a5, 4(a0) 28330; RV32IA-NEXT: mv s2, a1 28331; RV32IA-NEXT: j .LBB234_2 28332; RV32IA-NEXT: .LBB234_1: # %atomicrmw.start 28333; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1 28334; RV32IA-NEXT: sw a4, 8(sp) 28335; RV32IA-NEXT: sw a5, 12(sp) 28336; RV32IA-NEXT: addi a1, sp, 8 28337; RV32IA-NEXT: li a4, 5 28338; RV32IA-NEXT: li a5, 5 28339; RV32IA-NEXT: mv a0, s1 28340; RV32IA-NEXT: call __atomic_compare_exchange_8 28341; RV32IA-NEXT: lw a4, 8(sp) 28342; RV32IA-NEXT: lw a5, 12(sp) 28343; RV32IA-NEXT: bnez a0, .LBB234_7 28344; RV32IA-NEXT: .LBB234_2: # %atomicrmw.start 28345; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28346; RV32IA-NEXT: beq a5, s0, .LBB234_4 28347; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28348; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1 28349; RV32IA-NEXT: sltu a0, s0, a5 28350; RV32IA-NEXT: j .LBB234_5 28351; RV32IA-NEXT: .LBB234_4: # in Loop: Header=BB234_2 Depth=1 28352; RV32IA-NEXT: sltu a0, s2, a4 28353; RV32IA-NEXT: .LBB234_5: # %atomicrmw.start 28354; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1 28355; RV32IA-NEXT: mv a2, a4 28356; RV32IA-NEXT: mv a3, a5 28357; RV32IA-NEXT: bnez a0, .LBB234_1 28358; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28359; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1 28360; RV32IA-NEXT: mv a2, s2 28361; RV32IA-NEXT: mv a3, s0 28362; RV32IA-NEXT: j .LBB234_1 28363; RV32IA-NEXT: .LBB234_7: # %atomicrmw.end 28364; RV32IA-NEXT: mv a0, a4 28365; RV32IA-NEXT: mv a1, a5 28366; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28367; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28368; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28369; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28370; RV32IA-NEXT: addi sp, sp, 32 28371; RV32IA-NEXT: ret 28372; 28373; RV64I-LABEL: atomicrmw_umax_i64_seq_cst: 28374; RV64I: # %bb.0: 28375; RV64I-NEXT: addi sp, sp, -32 28376; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 28377; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 28378; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 28379; RV64I-NEXT: mv s0, a0 28380; RV64I-NEXT: ld a3, 0(a0) 28381; RV64I-NEXT: mv s1, a1 28382; RV64I-NEXT: j .LBB234_2 28383; RV64I-NEXT: .LBB234_1: # %atomicrmw.start 28384; RV64I-NEXT: # in Loop: Header=BB234_2 Depth=1 28385; RV64I-NEXT: sd a3, 0(sp) 28386; RV64I-NEXT: mv a1, sp 28387; RV64I-NEXT: li a3, 5 28388; RV64I-NEXT: li a4, 5 28389; RV64I-NEXT: mv a0, s0 28390; RV64I-NEXT: call __atomic_compare_exchange_8 28391; RV64I-NEXT: ld a3, 0(sp) 28392; RV64I-NEXT: bnez a0, .LBB234_4 28393; RV64I-NEXT: .LBB234_2: # %atomicrmw.start 28394; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 28395; RV64I-NEXT: mv a2, a3 28396; RV64I-NEXT: bltu s1, a3, .LBB234_1 28397; RV64I-NEXT: # %bb.3: # %atomicrmw.start 28398; RV64I-NEXT: # in Loop: Header=BB234_2 Depth=1 28399; RV64I-NEXT: mv a2, s1 28400; RV64I-NEXT: j .LBB234_1 28401; RV64I-NEXT: .LBB234_4: # %atomicrmw.end 28402; RV64I-NEXT: mv a0, a3 28403; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 28404; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 28405; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 28406; RV64I-NEXT: addi sp, sp, 32 28407; RV64I-NEXT: ret 28408; 28409; RV64IA-WMO-LABEL: atomicrmw_umax_i64_seq_cst: 28410; RV64IA-WMO: # %bb.0: 28411; RV64IA-WMO-NEXT: amomaxu.d.aqrl a0, a1, (a0) 28412; RV64IA-WMO-NEXT: ret 28413; 28414; RV64IA-TSO-LABEL: atomicrmw_umax_i64_seq_cst: 28415; RV64IA-TSO: # %bb.0: 28416; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0) 28417; RV64IA-TSO-NEXT: ret 28418 %1 = atomicrmw umax ptr %a, i64 %b seq_cst 28419 ret i64 %1 28420} 28421 28422define i64 @atomicrmw_umin_i64_monotonic(ptr %a, i64 %b) nounwind { 28423; RV32I-LABEL: atomicrmw_umin_i64_monotonic: 28424; RV32I: # %bb.0: 28425; RV32I-NEXT: addi sp, sp, -32 28426; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28427; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28428; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28429; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28430; RV32I-NEXT: mv s0, a2 28431; RV32I-NEXT: mv s1, a0 28432; RV32I-NEXT: lw a4, 0(a0) 28433; RV32I-NEXT: lw a5, 4(a0) 28434; RV32I-NEXT: mv s2, a1 28435; RV32I-NEXT: j .LBB235_2 28436; RV32I-NEXT: .LBB235_1: # %atomicrmw.start 28437; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1 28438; RV32I-NEXT: sw a4, 8(sp) 28439; RV32I-NEXT: sw a5, 12(sp) 28440; RV32I-NEXT: addi a1, sp, 8 28441; RV32I-NEXT: mv a0, s1 28442; RV32I-NEXT: li a4, 0 28443; RV32I-NEXT: li a5, 0 28444; RV32I-NEXT: call __atomic_compare_exchange_8 28445; RV32I-NEXT: lw a4, 8(sp) 28446; RV32I-NEXT: lw a5, 12(sp) 28447; RV32I-NEXT: bnez a0, .LBB235_7 28448; RV32I-NEXT: .LBB235_2: # %atomicrmw.start 28449; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 28450; RV32I-NEXT: beq a5, s0, .LBB235_4 28451; RV32I-NEXT: # %bb.3: # %atomicrmw.start 28452; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1 28453; RV32I-NEXT: sltu a0, s0, a5 28454; RV32I-NEXT: j .LBB235_5 28455; RV32I-NEXT: .LBB235_4: # in Loop: Header=BB235_2 Depth=1 28456; RV32I-NEXT: sltu a0, s2, a4 28457; RV32I-NEXT: .LBB235_5: # %atomicrmw.start 28458; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1 28459; RV32I-NEXT: mv a2, a4 28460; RV32I-NEXT: mv a3, a5 28461; RV32I-NEXT: beqz a0, .LBB235_1 28462; RV32I-NEXT: # %bb.6: # %atomicrmw.start 28463; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1 28464; RV32I-NEXT: mv a2, s2 28465; RV32I-NEXT: mv a3, s0 28466; RV32I-NEXT: j .LBB235_1 28467; RV32I-NEXT: .LBB235_7: # %atomicrmw.end 28468; RV32I-NEXT: mv a0, a4 28469; RV32I-NEXT: mv a1, a5 28470; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28471; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28472; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28473; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28474; RV32I-NEXT: addi sp, sp, 32 28475; RV32I-NEXT: ret 28476; 28477; RV32IA-LABEL: atomicrmw_umin_i64_monotonic: 28478; RV32IA: # %bb.0: 28479; RV32IA-NEXT: addi sp, sp, -32 28480; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28481; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28482; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28483; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28484; RV32IA-NEXT: mv s0, a2 28485; RV32IA-NEXT: mv s1, a0 28486; RV32IA-NEXT: lw a4, 0(a0) 28487; RV32IA-NEXT: lw a5, 4(a0) 28488; RV32IA-NEXT: mv s2, a1 28489; RV32IA-NEXT: j .LBB235_2 28490; RV32IA-NEXT: .LBB235_1: # %atomicrmw.start 28491; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1 28492; RV32IA-NEXT: sw a4, 8(sp) 28493; RV32IA-NEXT: sw a5, 12(sp) 28494; RV32IA-NEXT: addi a1, sp, 8 28495; RV32IA-NEXT: mv a0, s1 28496; RV32IA-NEXT: li a4, 0 28497; RV32IA-NEXT: li a5, 0 28498; RV32IA-NEXT: call __atomic_compare_exchange_8 28499; RV32IA-NEXT: lw a4, 8(sp) 28500; RV32IA-NEXT: lw a5, 12(sp) 28501; RV32IA-NEXT: bnez a0, .LBB235_7 28502; RV32IA-NEXT: .LBB235_2: # %atomicrmw.start 28503; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28504; RV32IA-NEXT: beq a5, s0, .LBB235_4 28505; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28506; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1 28507; RV32IA-NEXT: sltu a0, s0, a5 28508; RV32IA-NEXT: j .LBB235_5 28509; RV32IA-NEXT: .LBB235_4: # in Loop: Header=BB235_2 Depth=1 28510; RV32IA-NEXT: sltu a0, s2, a4 28511; RV32IA-NEXT: .LBB235_5: # %atomicrmw.start 28512; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1 28513; RV32IA-NEXT: mv a2, a4 28514; RV32IA-NEXT: mv a3, a5 28515; RV32IA-NEXT: beqz a0, .LBB235_1 28516; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28517; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1 28518; RV32IA-NEXT: mv a2, s2 28519; RV32IA-NEXT: mv a3, s0 28520; RV32IA-NEXT: j .LBB235_1 28521; RV32IA-NEXT: .LBB235_7: # %atomicrmw.end 28522; RV32IA-NEXT: mv a0, a4 28523; RV32IA-NEXT: mv a1, a5 28524; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28525; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28526; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28527; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28528; RV32IA-NEXT: addi sp, sp, 32 28529; RV32IA-NEXT: ret 28530; 28531; RV64I-LABEL: atomicrmw_umin_i64_monotonic: 28532; RV64I: # %bb.0: 28533; RV64I-NEXT: addi sp, sp, -32 28534; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 28535; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 28536; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 28537; RV64I-NEXT: mv s0, a0 28538; RV64I-NEXT: ld a3, 0(a0) 28539; RV64I-NEXT: mv s1, a1 28540; RV64I-NEXT: j .LBB235_2 28541; RV64I-NEXT: .LBB235_1: # %atomicrmw.start 28542; RV64I-NEXT: # in Loop: Header=BB235_2 Depth=1 28543; RV64I-NEXT: sd a3, 0(sp) 28544; RV64I-NEXT: mv a1, sp 28545; RV64I-NEXT: mv a0, s0 28546; RV64I-NEXT: li a3, 0 28547; RV64I-NEXT: li a4, 0 28548; RV64I-NEXT: call __atomic_compare_exchange_8 28549; RV64I-NEXT: ld a3, 0(sp) 28550; RV64I-NEXT: bnez a0, .LBB235_4 28551; RV64I-NEXT: .LBB235_2: # %atomicrmw.start 28552; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 28553; RV64I-NEXT: mv a2, a3 28554; RV64I-NEXT: bgeu s1, a3, .LBB235_1 28555; RV64I-NEXT: # %bb.3: # %atomicrmw.start 28556; RV64I-NEXT: # in Loop: Header=BB235_2 Depth=1 28557; RV64I-NEXT: mv a2, s1 28558; RV64I-NEXT: j .LBB235_1 28559; RV64I-NEXT: .LBB235_4: # %atomicrmw.end 28560; RV64I-NEXT: mv a0, a3 28561; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 28562; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 28563; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 28564; RV64I-NEXT: addi sp, sp, 32 28565; RV64I-NEXT: ret 28566; 28567; RV64IA-LABEL: atomicrmw_umin_i64_monotonic: 28568; RV64IA: # %bb.0: 28569; RV64IA-NEXT: amominu.d a0, a1, (a0) 28570; RV64IA-NEXT: ret 28571 %1 = atomicrmw umin ptr %a, i64 %b monotonic 28572 ret i64 %1 28573} 28574 28575define i64 @atomicrmw_umin_i64_acquire(ptr %a, i64 %b) nounwind { 28576; RV32I-LABEL: atomicrmw_umin_i64_acquire: 28577; RV32I: # %bb.0: 28578; RV32I-NEXT: addi sp, sp, -32 28579; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28580; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28581; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28582; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28583; RV32I-NEXT: mv s0, a2 28584; RV32I-NEXT: mv s1, a0 28585; RV32I-NEXT: lw a4, 0(a0) 28586; RV32I-NEXT: lw a5, 4(a0) 28587; RV32I-NEXT: mv s2, a1 28588; RV32I-NEXT: j .LBB236_2 28589; RV32I-NEXT: .LBB236_1: # %atomicrmw.start 28590; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1 28591; RV32I-NEXT: sw a4, 8(sp) 28592; RV32I-NEXT: sw a5, 12(sp) 28593; RV32I-NEXT: addi a1, sp, 8 28594; RV32I-NEXT: li a4, 2 28595; RV32I-NEXT: li a5, 2 28596; RV32I-NEXT: mv a0, s1 28597; RV32I-NEXT: call __atomic_compare_exchange_8 28598; RV32I-NEXT: lw a4, 8(sp) 28599; RV32I-NEXT: lw a5, 12(sp) 28600; RV32I-NEXT: bnez a0, .LBB236_7 28601; RV32I-NEXT: .LBB236_2: # %atomicrmw.start 28602; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 28603; RV32I-NEXT: beq a5, s0, .LBB236_4 28604; RV32I-NEXT: # %bb.3: # %atomicrmw.start 28605; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1 28606; RV32I-NEXT: sltu a0, s0, a5 28607; RV32I-NEXT: j .LBB236_5 28608; RV32I-NEXT: .LBB236_4: # in Loop: Header=BB236_2 Depth=1 28609; RV32I-NEXT: sltu a0, s2, a4 28610; RV32I-NEXT: .LBB236_5: # %atomicrmw.start 28611; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1 28612; RV32I-NEXT: mv a2, a4 28613; RV32I-NEXT: mv a3, a5 28614; RV32I-NEXT: beqz a0, .LBB236_1 28615; RV32I-NEXT: # %bb.6: # %atomicrmw.start 28616; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1 28617; RV32I-NEXT: mv a2, s2 28618; RV32I-NEXT: mv a3, s0 28619; RV32I-NEXT: j .LBB236_1 28620; RV32I-NEXT: .LBB236_7: # %atomicrmw.end 28621; RV32I-NEXT: mv a0, a4 28622; RV32I-NEXT: mv a1, a5 28623; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28624; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28625; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28626; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28627; RV32I-NEXT: addi sp, sp, 32 28628; RV32I-NEXT: ret 28629; 28630; RV32IA-LABEL: atomicrmw_umin_i64_acquire: 28631; RV32IA: # %bb.0: 28632; RV32IA-NEXT: addi sp, sp, -32 28633; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28634; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28635; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28636; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28637; RV32IA-NEXT: mv s0, a2 28638; RV32IA-NEXT: mv s1, a0 28639; RV32IA-NEXT: lw a4, 0(a0) 28640; RV32IA-NEXT: lw a5, 4(a0) 28641; RV32IA-NEXT: mv s2, a1 28642; RV32IA-NEXT: j .LBB236_2 28643; RV32IA-NEXT: .LBB236_1: # %atomicrmw.start 28644; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1 28645; RV32IA-NEXT: sw a4, 8(sp) 28646; RV32IA-NEXT: sw a5, 12(sp) 28647; RV32IA-NEXT: addi a1, sp, 8 28648; RV32IA-NEXT: li a4, 2 28649; RV32IA-NEXT: li a5, 2 28650; RV32IA-NEXT: mv a0, s1 28651; RV32IA-NEXT: call __atomic_compare_exchange_8 28652; RV32IA-NEXT: lw a4, 8(sp) 28653; RV32IA-NEXT: lw a5, 12(sp) 28654; RV32IA-NEXT: bnez a0, .LBB236_7 28655; RV32IA-NEXT: .LBB236_2: # %atomicrmw.start 28656; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28657; RV32IA-NEXT: beq a5, s0, .LBB236_4 28658; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28659; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1 28660; RV32IA-NEXT: sltu a0, s0, a5 28661; RV32IA-NEXT: j .LBB236_5 28662; RV32IA-NEXT: .LBB236_4: # in Loop: Header=BB236_2 Depth=1 28663; RV32IA-NEXT: sltu a0, s2, a4 28664; RV32IA-NEXT: .LBB236_5: # %atomicrmw.start 28665; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1 28666; RV32IA-NEXT: mv a2, a4 28667; RV32IA-NEXT: mv a3, a5 28668; RV32IA-NEXT: beqz a0, .LBB236_1 28669; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28670; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1 28671; RV32IA-NEXT: mv a2, s2 28672; RV32IA-NEXT: mv a3, s0 28673; RV32IA-NEXT: j .LBB236_1 28674; RV32IA-NEXT: .LBB236_7: # %atomicrmw.end 28675; RV32IA-NEXT: mv a0, a4 28676; RV32IA-NEXT: mv a1, a5 28677; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28678; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28679; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28680; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28681; RV32IA-NEXT: addi sp, sp, 32 28682; RV32IA-NEXT: ret 28683; 28684; RV64I-LABEL: atomicrmw_umin_i64_acquire: 28685; RV64I: # %bb.0: 28686; RV64I-NEXT: addi sp, sp, -32 28687; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 28688; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 28689; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 28690; RV64I-NEXT: mv s0, a0 28691; RV64I-NEXT: ld a3, 0(a0) 28692; RV64I-NEXT: mv s1, a1 28693; RV64I-NEXT: j .LBB236_2 28694; RV64I-NEXT: .LBB236_1: # %atomicrmw.start 28695; RV64I-NEXT: # in Loop: Header=BB236_2 Depth=1 28696; RV64I-NEXT: sd a3, 0(sp) 28697; RV64I-NEXT: mv a1, sp 28698; RV64I-NEXT: li a3, 2 28699; RV64I-NEXT: li a4, 2 28700; RV64I-NEXT: mv a0, s0 28701; RV64I-NEXT: call __atomic_compare_exchange_8 28702; RV64I-NEXT: ld a3, 0(sp) 28703; RV64I-NEXT: bnez a0, .LBB236_4 28704; RV64I-NEXT: .LBB236_2: # %atomicrmw.start 28705; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 28706; RV64I-NEXT: mv a2, a3 28707; RV64I-NEXT: bgeu s1, a3, .LBB236_1 28708; RV64I-NEXT: # %bb.3: # %atomicrmw.start 28709; RV64I-NEXT: # in Loop: Header=BB236_2 Depth=1 28710; RV64I-NEXT: mv a2, s1 28711; RV64I-NEXT: j .LBB236_1 28712; RV64I-NEXT: .LBB236_4: # %atomicrmw.end 28713; RV64I-NEXT: mv a0, a3 28714; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 28715; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 28716; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 28717; RV64I-NEXT: addi sp, sp, 32 28718; RV64I-NEXT: ret 28719; 28720; RV64IA-WMO-LABEL: atomicrmw_umin_i64_acquire: 28721; RV64IA-WMO: # %bb.0: 28722; RV64IA-WMO-NEXT: amominu.d.aq a0, a1, (a0) 28723; RV64IA-WMO-NEXT: ret 28724; 28725; RV64IA-TSO-LABEL: atomicrmw_umin_i64_acquire: 28726; RV64IA-TSO: # %bb.0: 28727; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0) 28728; RV64IA-TSO-NEXT: ret 28729 %1 = atomicrmw umin ptr %a, i64 %b acquire 28730 ret i64 %1 28731} 28732 28733define i64 @atomicrmw_umin_i64_release(ptr %a, i64 %b) nounwind { 28734; RV32I-LABEL: atomicrmw_umin_i64_release: 28735; RV32I: # %bb.0: 28736; RV32I-NEXT: addi sp, sp, -32 28737; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28738; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28739; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28740; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28741; RV32I-NEXT: mv s0, a2 28742; RV32I-NEXT: mv s1, a0 28743; RV32I-NEXT: lw a4, 0(a0) 28744; RV32I-NEXT: lw a5, 4(a0) 28745; RV32I-NEXT: mv s2, a1 28746; RV32I-NEXT: j .LBB237_2 28747; RV32I-NEXT: .LBB237_1: # %atomicrmw.start 28748; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1 28749; RV32I-NEXT: sw a4, 8(sp) 28750; RV32I-NEXT: sw a5, 12(sp) 28751; RV32I-NEXT: addi a1, sp, 8 28752; RV32I-NEXT: li a4, 3 28753; RV32I-NEXT: mv a0, s1 28754; RV32I-NEXT: li a5, 0 28755; RV32I-NEXT: call __atomic_compare_exchange_8 28756; RV32I-NEXT: lw a4, 8(sp) 28757; RV32I-NEXT: lw a5, 12(sp) 28758; RV32I-NEXT: bnez a0, .LBB237_7 28759; RV32I-NEXT: .LBB237_2: # %atomicrmw.start 28760; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 28761; RV32I-NEXT: beq a5, s0, .LBB237_4 28762; RV32I-NEXT: # %bb.3: # %atomicrmw.start 28763; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1 28764; RV32I-NEXT: sltu a0, s0, a5 28765; RV32I-NEXT: j .LBB237_5 28766; RV32I-NEXT: .LBB237_4: # in Loop: Header=BB237_2 Depth=1 28767; RV32I-NEXT: sltu a0, s2, a4 28768; RV32I-NEXT: .LBB237_5: # %atomicrmw.start 28769; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1 28770; RV32I-NEXT: mv a2, a4 28771; RV32I-NEXT: mv a3, a5 28772; RV32I-NEXT: beqz a0, .LBB237_1 28773; RV32I-NEXT: # %bb.6: # %atomicrmw.start 28774; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1 28775; RV32I-NEXT: mv a2, s2 28776; RV32I-NEXT: mv a3, s0 28777; RV32I-NEXT: j .LBB237_1 28778; RV32I-NEXT: .LBB237_7: # %atomicrmw.end 28779; RV32I-NEXT: mv a0, a4 28780; RV32I-NEXT: mv a1, a5 28781; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28782; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28783; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28784; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28785; RV32I-NEXT: addi sp, sp, 32 28786; RV32I-NEXT: ret 28787; 28788; RV32IA-LABEL: atomicrmw_umin_i64_release: 28789; RV32IA: # %bb.0: 28790; RV32IA-NEXT: addi sp, sp, -32 28791; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28792; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28793; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28794; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28795; RV32IA-NEXT: mv s0, a2 28796; RV32IA-NEXT: mv s1, a0 28797; RV32IA-NEXT: lw a4, 0(a0) 28798; RV32IA-NEXT: lw a5, 4(a0) 28799; RV32IA-NEXT: mv s2, a1 28800; RV32IA-NEXT: j .LBB237_2 28801; RV32IA-NEXT: .LBB237_1: # %atomicrmw.start 28802; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1 28803; RV32IA-NEXT: sw a4, 8(sp) 28804; RV32IA-NEXT: sw a5, 12(sp) 28805; RV32IA-NEXT: addi a1, sp, 8 28806; RV32IA-NEXT: li a4, 3 28807; RV32IA-NEXT: mv a0, s1 28808; RV32IA-NEXT: li a5, 0 28809; RV32IA-NEXT: call __atomic_compare_exchange_8 28810; RV32IA-NEXT: lw a4, 8(sp) 28811; RV32IA-NEXT: lw a5, 12(sp) 28812; RV32IA-NEXT: bnez a0, .LBB237_7 28813; RV32IA-NEXT: .LBB237_2: # %atomicrmw.start 28814; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28815; RV32IA-NEXT: beq a5, s0, .LBB237_4 28816; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28817; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1 28818; RV32IA-NEXT: sltu a0, s0, a5 28819; RV32IA-NEXT: j .LBB237_5 28820; RV32IA-NEXT: .LBB237_4: # in Loop: Header=BB237_2 Depth=1 28821; RV32IA-NEXT: sltu a0, s2, a4 28822; RV32IA-NEXT: .LBB237_5: # %atomicrmw.start 28823; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1 28824; RV32IA-NEXT: mv a2, a4 28825; RV32IA-NEXT: mv a3, a5 28826; RV32IA-NEXT: beqz a0, .LBB237_1 28827; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28828; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1 28829; RV32IA-NEXT: mv a2, s2 28830; RV32IA-NEXT: mv a3, s0 28831; RV32IA-NEXT: j .LBB237_1 28832; RV32IA-NEXT: .LBB237_7: # %atomicrmw.end 28833; RV32IA-NEXT: mv a0, a4 28834; RV32IA-NEXT: mv a1, a5 28835; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28836; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28837; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28838; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28839; RV32IA-NEXT: addi sp, sp, 32 28840; RV32IA-NEXT: ret 28841; 28842; RV64I-LABEL: atomicrmw_umin_i64_release: 28843; RV64I: # %bb.0: 28844; RV64I-NEXT: addi sp, sp, -32 28845; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 28846; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 28847; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 28848; RV64I-NEXT: mv s0, a0 28849; RV64I-NEXT: ld a3, 0(a0) 28850; RV64I-NEXT: mv s1, a1 28851; RV64I-NEXT: j .LBB237_2 28852; RV64I-NEXT: .LBB237_1: # %atomicrmw.start 28853; RV64I-NEXT: # in Loop: Header=BB237_2 Depth=1 28854; RV64I-NEXT: sd a3, 0(sp) 28855; RV64I-NEXT: mv a1, sp 28856; RV64I-NEXT: li a3, 3 28857; RV64I-NEXT: mv a0, s0 28858; RV64I-NEXT: li a4, 0 28859; RV64I-NEXT: call __atomic_compare_exchange_8 28860; RV64I-NEXT: ld a3, 0(sp) 28861; RV64I-NEXT: bnez a0, .LBB237_4 28862; RV64I-NEXT: .LBB237_2: # %atomicrmw.start 28863; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 28864; RV64I-NEXT: mv a2, a3 28865; RV64I-NEXT: bgeu s1, a3, .LBB237_1 28866; RV64I-NEXT: # %bb.3: # %atomicrmw.start 28867; RV64I-NEXT: # in Loop: Header=BB237_2 Depth=1 28868; RV64I-NEXT: mv a2, s1 28869; RV64I-NEXT: j .LBB237_1 28870; RV64I-NEXT: .LBB237_4: # %atomicrmw.end 28871; RV64I-NEXT: mv a0, a3 28872; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 28873; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 28874; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 28875; RV64I-NEXT: addi sp, sp, 32 28876; RV64I-NEXT: ret 28877; 28878; RV64IA-WMO-LABEL: atomicrmw_umin_i64_release: 28879; RV64IA-WMO: # %bb.0: 28880; RV64IA-WMO-NEXT: amominu.d.rl a0, a1, (a0) 28881; RV64IA-WMO-NEXT: ret 28882; 28883; RV64IA-TSO-LABEL: atomicrmw_umin_i64_release: 28884; RV64IA-TSO: # %bb.0: 28885; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0) 28886; RV64IA-TSO-NEXT: ret 28887 %1 = atomicrmw umin ptr %a, i64 %b release 28888 ret i64 %1 28889} 28890 28891define i64 @atomicrmw_umin_i64_acq_rel(ptr %a, i64 %b) nounwind { 28892; RV32I-LABEL: atomicrmw_umin_i64_acq_rel: 28893; RV32I: # %bb.0: 28894; RV32I-NEXT: addi sp, sp, -32 28895; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28896; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28897; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28898; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28899; RV32I-NEXT: mv s0, a2 28900; RV32I-NEXT: mv s1, a0 28901; RV32I-NEXT: lw a4, 0(a0) 28902; RV32I-NEXT: lw a5, 4(a0) 28903; RV32I-NEXT: mv s2, a1 28904; RV32I-NEXT: j .LBB238_2 28905; RV32I-NEXT: .LBB238_1: # %atomicrmw.start 28906; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1 28907; RV32I-NEXT: sw a4, 8(sp) 28908; RV32I-NEXT: sw a5, 12(sp) 28909; RV32I-NEXT: addi a1, sp, 8 28910; RV32I-NEXT: li a4, 4 28911; RV32I-NEXT: li a5, 2 28912; RV32I-NEXT: mv a0, s1 28913; RV32I-NEXT: call __atomic_compare_exchange_8 28914; RV32I-NEXT: lw a4, 8(sp) 28915; RV32I-NEXT: lw a5, 12(sp) 28916; RV32I-NEXT: bnez a0, .LBB238_7 28917; RV32I-NEXT: .LBB238_2: # %atomicrmw.start 28918; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 28919; RV32I-NEXT: beq a5, s0, .LBB238_4 28920; RV32I-NEXT: # %bb.3: # %atomicrmw.start 28921; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1 28922; RV32I-NEXT: sltu a0, s0, a5 28923; RV32I-NEXT: j .LBB238_5 28924; RV32I-NEXT: .LBB238_4: # in Loop: Header=BB238_2 Depth=1 28925; RV32I-NEXT: sltu a0, s2, a4 28926; RV32I-NEXT: .LBB238_5: # %atomicrmw.start 28927; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1 28928; RV32I-NEXT: mv a2, a4 28929; RV32I-NEXT: mv a3, a5 28930; RV32I-NEXT: beqz a0, .LBB238_1 28931; RV32I-NEXT: # %bb.6: # %atomicrmw.start 28932; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1 28933; RV32I-NEXT: mv a2, s2 28934; RV32I-NEXT: mv a3, s0 28935; RV32I-NEXT: j .LBB238_1 28936; RV32I-NEXT: .LBB238_7: # %atomicrmw.end 28937; RV32I-NEXT: mv a0, a4 28938; RV32I-NEXT: mv a1, a5 28939; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28940; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28941; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28942; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28943; RV32I-NEXT: addi sp, sp, 32 28944; RV32I-NEXT: ret 28945; 28946; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel: 28947; RV32IA: # %bb.0: 28948; RV32IA-NEXT: addi sp, sp, -32 28949; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 28950; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 28951; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 28952; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 28953; RV32IA-NEXT: mv s0, a2 28954; RV32IA-NEXT: mv s1, a0 28955; RV32IA-NEXT: lw a4, 0(a0) 28956; RV32IA-NEXT: lw a5, 4(a0) 28957; RV32IA-NEXT: mv s2, a1 28958; RV32IA-NEXT: j .LBB238_2 28959; RV32IA-NEXT: .LBB238_1: # %atomicrmw.start 28960; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1 28961; RV32IA-NEXT: sw a4, 8(sp) 28962; RV32IA-NEXT: sw a5, 12(sp) 28963; RV32IA-NEXT: addi a1, sp, 8 28964; RV32IA-NEXT: li a4, 4 28965; RV32IA-NEXT: li a5, 2 28966; RV32IA-NEXT: mv a0, s1 28967; RV32IA-NEXT: call __atomic_compare_exchange_8 28968; RV32IA-NEXT: lw a4, 8(sp) 28969; RV32IA-NEXT: lw a5, 12(sp) 28970; RV32IA-NEXT: bnez a0, .LBB238_7 28971; RV32IA-NEXT: .LBB238_2: # %atomicrmw.start 28972; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 28973; RV32IA-NEXT: beq a5, s0, .LBB238_4 28974; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 28975; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1 28976; RV32IA-NEXT: sltu a0, s0, a5 28977; RV32IA-NEXT: j .LBB238_5 28978; RV32IA-NEXT: .LBB238_4: # in Loop: Header=BB238_2 Depth=1 28979; RV32IA-NEXT: sltu a0, s2, a4 28980; RV32IA-NEXT: .LBB238_5: # %atomicrmw.start 28981; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1 28982; RV32IA-NEXT: mv a2, a4 28983; RV32IA-NEXT: mv a3, a5 28984; RV32IA-NEXT: beqz a0, .LBB238_1 28985; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 28986; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1 28987; RV32IA-NEXT: mv a2, s2 28988; RV32IA-NEXT: mv a3, s0 28989; RV32IA-NEXT: j .LBB238_1 28990; RV32IA-NEXT: .LBB238_7: # %atomicrmw.end 28991; RV32IA-NEXT: mv a0, a4 28992; RV32IA-NEXT: mv a1, a5 28993; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 28994; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 28995; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 28996; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 28997; RV32IA-NEXT: addi sp, sp, 32 28998; RV32IA-NEXT: ret 28999; 29000; RV64I-LABEL: atomicrmw_umin_i64_acq_rel: 29001; RV64I: # %bb.0: 29002; RV64I-NEXT: addi sp, sp, -32 29003; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 29004; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 29005; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 29006; RV64I-NEXT: mv s0, a0 29007; RV64I-NEXT: ld a3, 0(a0) 29008; RV64I-NEXT: mv s1, a1 29009; RV64I-NEXT: j .LBB238_2 29010; RV64I-NEXT: .LBB238_1: # %atomicrmw.start 29011; RV64I-NEXT: # in Loop: Header=BB238_2 Depth=1 29012; RV64I-NEXT: sd a3, 0(sp) 29013; RV64I-NEXT: mv a1, sp 29014; RV64I-NEXT: li a3, 4 29015; RV64I-NEXT: li a4, 2 29016; RV64I-NEXT: mv a0, s0 29017; RV64I-NEXT: call __atomic_compare_exchange_8 29018; RV64I-NEXT: ld a3, 0(sp) 29019; RV64I-NEXT: bnez a0, .LBB238_4 29020; RV64I-NEXT: .LBB238_2: # %atomicrmw.start 29021; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 29022; RV64I-NEXT: mv a2, a3 29023; RV64I-NEXT: bgeu s1, a3, .LBB238_1 29024; RV64I-NEXT: # %bb.3: # %atomicrmw.start 29025; RV64I-NEXT: # in Loop: Header=BB238_2 Depth=1 29026; RV64I-NEXT: mv a2, s1 29027; RV64I-NEXT: j .LBB238_1 29028; RV64I-NEXT: .LBB238_4: # %atomicrmw.end 29029; RV64I-NEXT: mv a0, a3 29030; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 29031; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 29032; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 29033; RV64I-NEXT: addi sp, sp, 32 29034; RV64I-NEXT: ret 29035; 29036; RV64IA-WMO-LABEL: atomicrmw_umin_i64_acq_rel: 29037; RV64IA-WMO: # %bb.0: 29038; RV64IA-WMO-NEXT: amominu.d.aqrl a0, a1, (a0) 29039; RV64IA-WMO-NEXT: ret 29040; 29041; RV64IA-TSO-LABEL: atomicrmw_umin_i64_acq_rel: 29042; RV64IA-TSO: # %bb.0: 29043; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0) 29044; RV64IA-TSO-NEXT: ret 29045 %1 = atomicrmw umin ptr %a, i64 %b acq_rel 29046 ret i64 %1 29047} 29048 29049define i64 @atomicrmw_umin_i64_seq_cst(ptr %a, i64 %b) nounwind { 29050; RV32I-LABEL: atomicrmw_umin_i64_seq_cst: 29051; RV32I: # %bb.0: 29052; RV32I-NEXT: addi sp, sp, -32 29053; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 29054; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 29055; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 29056; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 29057; RV32I-NEXT: mv s0, a2 29058; RV32I-NEXT: mv s1, a0 29059; RV32I-NEXT: lw a4, 0(a0) 29060; RV32I-NEXT: lw a5, 4(a0) 29061; RV32I-NEXT: mv s2, a1 29062; RV32I-NEXT: j .LBB239_2 29063; RV32I-NEXT: .LBB239_1: # %atomicrmw.start 29064; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1 29065; RV32I-NEXT: sw a4, 8(sp) 29066; RV32I-NEXT: sw a5, 12(sp) 29067; RV32I-NEXT: addi a1, sp, 8 29068; RV32I-NEXT: li a4, 5 29069; RV32I-NEXT: li a5, 5 29070; RV32I-NEXT: mv a0, s1 29071; RV32I-NEXT: call __atomic_compare_exchange_8 29072; RV32I-NEXT: lw a4, 8(sp) 29073; RV32I-NEXT: lw a5, 12(sp) 29074; RV32I-NEXT: bnez a0, .LBB239_7 29075; RV32I-NEXT: .LBB239_2: # %atomicrmw.start 29076; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 29077; RV32I-NEXT: beq a5, s0, .LBB239_4 29078; RV32I-NEXT: # %bb.3: # %atomicrmw.start 29079; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1 29080; RV32I-NEXT: sltu a0, s0, a5 29081; RV32I-NEXT: j .LBB239_5 29082; RV32I-NEXT: .LBB239_4: # in Loop: Header=BB239_2 Depth=1 29083; RV32I-NEXT: sltu a0, s2, a4 29084; RV32I-NEXT: .LBB239_5: # %atomicrmw.start 29085; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1 29086; RV32I-NEXT: mv a2, a4 29087; RV32I-NEXT: mv a3, a5 29088; RV32I-NEXT: beqz a0, .LBB239_1 29089; RV32I-NEXT: # %bb.6: # %atomicrmw.start 29090; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1 29091; RV32I-NEXT: mv a2, s2 29092; RV32I-NEXT: mv a3, s0 29093; RV32I-NEXT: j .LBB239_1 29094; RV32I-NEXT: .LBB239_7: # %atomicrmw.end 29095; RV32I-NEXT: mv a0, a4 29096; RV32I-NEXT: mv a1, a5 29097; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 29098; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 29099; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 29100; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 29101; RV32I-NEXT: addi sp, sp, 32 29102; RV32I-NEXT: ret 29103; 29104; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst: 29105; RV32IA: # %bb.0: 29106; RV32IA-NEXT: addi sp, sp, -32 29107; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 29108; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 29109; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 29110; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 29111; RV32IA-NEXT: mv s0, a2 29112; RV32IA-NEXT: mv s1, a0 29113; RV32IA-NEXT: lw a4, 0(a0) 29114; RV32IA-NEXT: lw a5, 4(a0) 29115; RV32IA-NEXT: mv s2, a1 29116; RV32IA-NEXT: j .LBB239_2 29117; RV32IA-NEXT: .LBB239_1: # %atomicrmw.start 29118; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1 29119; RV32IA-NEXT: sw a4, 8(sp) 29120; RV32IA-NEXT: sw a5, 12(sp) 29121; RV32IA-NEXT: addi a1, sp, 8 29122; RV32IA-NEXT: li a4, 5 29123; RV32IA-NEXT: li a5, 5 29124; RV32IA-NEXT: mv a0, s1 29125; RV32IA-NEXT: call __atomic_compare_exchange_8 29126; RV32IA-NEXT: lw a4, 8(sp) 29127; RV32IA-NEXT: lw a5, 12(sp) 29128; RV32IA-NEXT: bnez a0, .LBB239_7 29129; RV32IA-NEXT: .LBB239_2: # %atomicrmw.start 29130; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 29131; RV32IA-NEXT: beq a5, s0, .LBB239_4 29132; RV32IA-NEXT: # %bb.3: # %atomicrmw.start 29133; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1 29134; RV32IA-NEXT: sltu a0, s0, a5 29135; RV32IA-NEXT: j .LBB239_5 29136; RV32IA-NEXT: .LBB239_4: # in Loop: Header=BB239_2 Depth=1 29137; RV32IA-NEXT: sltu a0, s2, a4 29138; RV32IA-NEXT: .LBB239_5: # %atomicrmw.start 29139; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1 29140; RV32IA-NEXT: mv a2, a4 29141; RV32IA-NEXT: mv a3, a5 29142; RV32IA-NEXT: beqz a0, .LBB239_1 29143; RV32IA-NEXT: # %bb.6: # %atomicrmw.start 29144; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1 29145; RV32IA-NEXT: mv a2, s2 29146; RV32IA-NEXT: mv a3, s0 29147; RV32IA-NEXT: j .LBB239_1 29148; RV32IA-NEXT: .LBB239_7: # %atomicrmw.end 29149; RV32IA-NEXT: mv a0, a4 29150; RV32IA-NEXT: mv a1, a5 29151; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 29152; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 29153; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 29154; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 29155; RV32IA-NEXT: addi sp, sp, 32 29156; RV32IA-NEXT: ret 29157; 29158; RV64I-LABEL: atomicrmw_umin_i64_seq_cst: 29159; RV64I: # %bb.0: 29160; RV64I-NEXT: addi sp, sp, -32 29161; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 29162; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 29163; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 29164; RV64I-NEXT: mv s0, a0 29165; RV64I-NEXT: ld a3, 0(a0) 29166; RV64I-NEXT: mv s1, a1 29167; RV64I-NEXT: j .LBB239_2 29168; RV64I-NEXT: .LBB239_1: # %atomicrmw.start 29169; RV64I-NEXT: # in Loop: Header=BB239_2 Depth=1 29170; RV64I-NEXT: sd a3, 0(sp) 29171; RV64I-NEXT: mv a1, sp 29172; RV64I-NEXT: li a3, 5 29173; RV64I-NEXT: li a4, 5 29174; RV64I-NEXT: mv a0, s0 29175; RV64I-NEXT: call __atomic_compare_exchange_8 29176; RV64I-NEXT: ld a3, 0(sp) 29177; RV64I-NEXT: bnez a0, .LBB239_4 29178; RV64I-NEXT: .LBB239_2: # %atomicrmw.start 29179; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 29180; RV64I-NEXT: mv a2, a3 29181; RV64I-NEXT: bgeu s1, a3, .LBB239_1 29182; RV64I-NEXT: # %bb.3: # %atomicrmw.start 29183; RV64I-NEXT: # in Loop: Header=BB239_2 Depth=1 29184; RV64I-NEXT: mv a2, s1 29185; RV64I-NEXT: j .LBB239_1 29186; RV64I-NEXT: .LBB239_4: # %atomicrmw.end 29187; RV64I-NEXT: mv a0, a3 29188; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 29189; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 29190; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 29191; RV64I-NEXT: addi sp, sp, 32 29192; RV64I-NEXT: ret 29193; 29194; RV64IA-WMO-LABEL: atomicrmw_umin_i64_seq_cst: 29195; RV64IA-WMO: # %bb.0: 29196; RV64IA-WMO-NEXT: amominu.d.aqrl a0, a1, (a0) 29197; RV64IA-WMO-NEXT: ret 29198; 29199; RV64IA-TSO-LABEL: atomicrmw_umin_i64_seq_cst: 29200; RV64IA-TSO: # %bb.0: 29201; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0) 29202; RV64IA-TSO-NEXT: ret 29203 %1 = atomicrmw umin ptr %a, i64 %b seq_cst 29204 ret i64 %1 29205} 29206