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