1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s \ 3; RUN: | FileCheck -check-prefix=CSKY %s 4 5define void @cmpxchg_i8_monotonic_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 6; CSKY-LABEL: cmpxchg_i8_monotonic_monotonic: 7; CSKY: # %bb.0: 8; CSKY-NEXT: subi16 sp, sp, 4 9; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 10; CSKY-NEXT: subi16 sp, sp, 8 11; CSKY-NEXT: st32.b a1, (sp, 7) 12; CSKY-NEXT: movi16 a1, 0 13; CSKY-NEXT: st16.w a1, (sp, 0) 14; CSKY-NEXT: addi32 a1, sp, 7 15; CSKY-NEXT: movi16 a3, 0 16; CSKY-NEXT: jsri32 [.LCPI0_0] 17; CSKY-NEXT: addi16 sp, sp, 8 18; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 19; CSKY-NEXT: addi16 sp, sp, 4 20; CSKY-NEXT: rts16 21; CSKY-NEXT: .p2align 1 22; CSKY-NEXT: # %bb.1: 23; CSKY-NEXT: .p2align 2 24; CSKY-NEXT: .LCPI0_0: 25; CSKY-NEXT: .long __atomic_compare_exchange_1 26; 27 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic 28 ret void 29} 30 31define void @cmpxchg_i8_acquire_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 32; CSKY-LABEL: cmpxchg_i8_acquire_monotonic: 33; CSKY: # %bb.0: 34; CSKY-NEXT: subi16 sp, sp, 4 35; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 36; CSKY-NEXT: subi16 sp, sp, 8 37; CSKY-NEXT: st32.b a1, (sp, 7) 38; CSKY-NEXT: movi16 a1, 0 39; CSKY-NEXT: st16.w a1, (sp, 0) 40; CSKY-NEXT: addi32 a1, sp, 7 41; CSKY-NEXT: movi16 a3, 2 42; CSKY-NEXT: jsri32 [.LCPI1_0] 43; CSKY-NEXT: addi16 sp, sp, 8 44; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 45; CSKY-NEXT: addi16 sp, sp, 4 46; CSKY-NEXT: rts16 47; CSKY-NEXT: .p2align 1 48; CSKY-NEXT: # %bb.1: 49; CSKY-NEXT: .p2align 2 50; CSKY-NEXT: .LCPI1_0: 51; CSKY-NEXT: .long __atomic_compare_exchange_1 52; 53 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire monotonic 54 ret void 55} 56 57define void @cmpxchg_i8_acquire_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind { 58; CSKY-LABEL: cmpxchg_i8_acquire_acquire: 59; CSKY: # %bb.0: 60; CSKY-NEXT: subi16 sp, sp, 4 61; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 62; CSKY-NEXT: subi16 sp, sp, 8 63; CSKY-NEXT: st32.b a1, (sp, 7) 64; CSKY-NEXT: movi16 a1, 2 65; CSKY-NEXT: st16.w a1, (sp, 0) 66; CSKY-NEXT: addi32 a1, sp, 7 67; CSKY-NEXT: movi16 a3, 2 68; CSKY-NEXT: jsri32 [.LCPI2_0] 69; CSKY-NEXT: addi16 sp, sp, 8 70; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 71; CSKY-NEXT: addi16 sp, sp, 4 72; CSKY-NEXT: rts16 73; CSKY-NEXT: .p2align 1 74; CSKY-NEXT: # %bb.1: 75; CSKY-NEXT: .p2align 2 76; CSKY-NEXT: .LCPI2_0: 77; CSKY-NEXT: .long __atomic_compare_exchange_1 78; 79 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acquire acquire 80 ret void 81} 82 83define void @cmpxchg_i8_release_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 84; CSKY-LABEL: cmpxchg_i8_release_monotonic: 85; CSKY: # %bb.0: 86; CSKY-NEXT: subi16 sp, sp, 4 87; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 88; CSKY-NEXT: subi16 sp, sp, 8 89; CSKY-NEXT: st32.b a1, (sp, 7) 90; CSKY-NEXT: movi16 a1, 0 91; CSKY-NEXT: st16.w a1, (sp, 0) 92; CSKY-NEXT: addi32 a1, sp, 7 93; CSKY-NEXT: movi16 a3, 3 94; CSKY-NEXT: jsri32 [.LCPI3_0] 95; CSKY-NEXT: addi16 sp, sp, 8 96; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 97; CSKY-NEXT: addi16 sp, sp, 4 98; CSKY-NEXT: rts16 99; CSKY-NEXT: .p2align 1 100; CSKY-NEXT: # %bb.1: 101; CSKY-NEXT: .p2align 2 102; CSKY-NEXT: .LCPI3_0: 103; CSKY-NEXT: .long __atomic_compare_exchange_1 104; 105 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val release monotonic 106 ret void 107} 108 109define void @cmpxchg_i8_release_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind { 110; CSKY-LABEL: cmpxchg_i8_release_acquire: 111; CSKY: # %bb.0: 112; CSKY-NEXT: subi16 sp, sp, 4 113; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 114; CSKY-NEXT: subi16 sp, sp, 8 115; CSKY-NEXT: st32.b a1, (sp, 7) 116; CSKY-NEXT: movi16 a1, 2 117; CSKY-NEXT: st16.w a1, (sp, 0) 118; CSKY-NEXT: addi32 a1, sp, 7 119; CSKY-NEXT: movi16 a3, 3 120; CSKY-NEXT: jsri32 [.LCPI4_0] 121; CSKY-NEXT: addi16 sp, sp, 8 122; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 123; CSKY-NEXT: addi16 sp, sp, 4 124; CSKY-NEXT: rts16 125; CSKY-NEXT: .p2align 1 126; CSKY-NEXT: # %bb.1: 127; CSKY-NEXT: .p2align 2 128; CSKY-NEXT: .LCPI4_0: 129; CSKY-NEXT: .long __atomic_compare_exchange_1 130; 131 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val release acquire 132 ret void 133} 134 135define void @cmpxchg_i8_acq_rel_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 136; CSKY-LABEL: cmpxchg_i8_acq_rel_monotonic: 137; CSKY: # %bb.0: 138; CSKY-NEXT: subi16 sp, sp, 4 139; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 140; CSKY-NEXT: subi16 sp, sp, 8 141; CSKY-NEXT: st32.b a1, (sp, 7) 142; CSKY-NEXT: movi16 a1, 0 143; CSKY-NEXT: st16.w a1, (sp, 0) 144; CSKY-NEXT: addi32 a1, sp, 7 145; CSKY-NEXT: movi16 a3, 4 146; CSKY-NEXT: jsri32 [.LCPI5_0] 147; CSKY-NEXT: addi16 sp, sp, 8 148; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 149; CSKY-NEXT: addi16 sp, sp, 4 150; CSKY-NEXT: rts16 151; CSKY-NEXT: .p2align 1 152; CSKY-NEXT: # %bb.1: 153; CSKY-NEXT: .p2align 2 154; CSKY-NEXT: .LCPI5_0: 155; CSKY-NEXT: .long __atomic_compare_exchange_1 156; 157 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acq_rel monotonic 158 ret void 159} 160 161define void @cmpxchg_i8_acq_rel_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind { 162; CSKY-LABEL: cmpxchg_i8_acq_rel_acquire: 163; CSKY: # %bb.0: 164; CSKY-NEXT: subi16 sp, sp, 4 165; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 166; CSKY-NEXT: subi16 sp, sp, 8 167; CSKY-NEXT: st32.b a1, (sp, 7) 168; CSKY-NEXT: movi16 a1, 2 169; CSKY-NEXT: st16.w a1, (sp, 0) 170; CSKY-NEXT: addi32 a1, sp, 7 171; CSKY-NEXT: movi16 a3, 4 172; CSKY-NEXT: jsri32 [.LCPI6_0] 173; CSKY-NEXT: addi16 sp, sp, 8 174; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 175; CSKY-NEXT: addi16 sp, sp, 4 176; CSKY-NEXT: rts16 177; CSKY-NEXT: .p2align 1 178; CSKY-NEXT: # %bb.1: 179; CSKY-NEXT: .p2align 2 180; CSKY-NEXT: .LCPI6_0: 181; CSKY-NEXT: .long __atomic_compare_exchange_1 182; 183 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val acq_rel acquire 184 ret void 185} 186 187define void @cmpxchg_i8_seq_cst_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind { 188; CSKY-LABEL: cmpxchg_i8_seq_cst_monotonic: 189; CSKY: # %bb.0: 190; CSKY-NEXT: subi16 sp, sp, 4 191; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 192; CSKY-NEXT: subi16 sp, sp, 8 193; CSKY-NEXT: st32.b a1, (sp, 7) 194; CSKY-NEXT: movi16 a1, 0 195; CSKY-NEXT: st16.w a1, (sp, 0) 196; CSKY-NEXT: addi32 a1, sp, 7 197; CSKY-NEXT: movi16 a3, 5 198; CSKY-NEXT: jsri32 [.LCPI7_0] 199; CSKY-NEXT: addi16 sp, sp, 8 200; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 201; CSKY-NEXT: addi16 sp, sp, 4 202; CSKY-NEXT: rts16 203; CSKY-NEXT: .p2align 1 204; CSKY-NEXT: # %bb.1: 205; CSKY-NEXT: .p2align 2 206; CSKY-NEXT: .LCPI7_0: 207; CSKY-NEXT: .long __atomic_compare_exchange_1 208; 209 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst monotonic 210 ret void 211} 212 213define void @cmpxchg_i8_seq_cst_acquire(ptr %ptr, i8 %cmp, i8 %val) nounwind { 214; CSKY-LABEL: cmpxchg_i8_seq_cst_acquire: 215; CSKY: # %bb.0: 216; CSKY-NEXT: subi16 sp, sp, 4 217; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 218; CSKY-NEXT: subi16 sp, sp, 8 219; CSKY-NEXT: st32.b a1, (sp, 7) 220; CSKY-NEXT: movi16 a1, 2 221; CSKY-NEXT: st16.w a1, (sp, 0) 222; CSKY-NEXT: addi32 a1, sp, 7 223; CSKY-NEXT: movi16 a3, 5 224; CSKY-NEXT: jsri32 [.LCPI8_0] 225; CSKY-NEXT: addi16 sp, sp, 8 226; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 227; CSKY-NEXT: addi16 sp, sp, 4 228; CSKY-NEXT: rts16 229; CSKY-NEXT: .p2align 1 230; CSKY-NEXT: # %bb.1: 231; CSKY-NEXT: .p2align 2 232; CSKY-NEXT: .LCPI8_0: 233; CSKY-NEXT: .long __atomic_compare_exchange_1 234; 235 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst acquire 236 ret void 237} 238 239define void @cmpxchg_i8_seq_cst_seq_cst(ptr %ptr, i8 %cmp, i8 %val) nounwind { 240; CSKY-LABEL: cmpxchg_i8_seq_cst_seq_cst: 241; CSKY: # %bb.0: 242; CSKY-NEXT: subi16 sp, sp, 4 243; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 244; CSKY-NEXT: subi16 sp, sp, 8 245; CSKY-NEXT: st32.b a1, (sp, 7) 246; CSKY-NEXT: movi16 a1, 5 247; CSKY-NEXT: st16.w a1, (sp, 0) 248; CSKY-NEXT: addi32 a1, sp, 7 249; CSKY-NEXT: movi16 a3, 5 250; CSKY-NEXT: jsri32 [.LCPI9_0] 251; CSKY-NEXT: addi16 sp, sp, 8 252; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 253; CSKY-NEXT: addi16 sp, sp, 4 254; CSKY-NEXT: rts16 255; CSKY-NEXT: .p2align 1 256; CSKY-NEXT: # %bb.1: 257; CSKY-NEXT: .p2align 2 258; CSKY-NEXT: .LCPI9_0: 259; CSKY-NEXT: .long __atomic_compare_exchange_1 260; 261 %res = cmpxchg ptr %ptr, i8 %cmp, i8 %val seq_cst seq_cst 262 ret void 263} 264 265define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 266; CSKY-LABEL: cmpxchg_i16_monotonic_monotonic: 267; CSKY: # %bb.0: 268; CSKY-NEXT: subi16 sp, sp, 4 269; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 270; CSKY-NEXT: subi16 sp, sp, 8 271; CSKY-NEXT: st32.h a1, (sp, 6) 272; CSKY-NEXT: movi16 a1, 0 273; CSKY-NEXT: st16.w a1, (sp, 0) 274; CSKY-NEXT: addi32 a1, sp, 6 275; CSKY-NEXT: movi16 a3, 0 276; CSKY-NEXT: jsri32 [.LCPI10_0] 277; CSKY-NEXT: addi16 sp, sp, 8 278; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 279; CSKY-NEXT: addi16 sp, sp, 4 280; CSKY-NEXT: rts16 281; CSKY-NEXT: .p2align 1 282; CSKY-NEXT: # %bb.1: 283; CSKY-NEXT: .p2align 2 284; CSKY-NEXT: .LCPI10_0: 285; CSKY-NEXT: .long __atomic_compare_exchange_2 286; 287 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic 288 ret void 289} 290 291define void @cmpxchg_i16_acquire_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 292; CSKY-LABEL: cmpxchg_i16_acquire_monotonic: 293; CSKY: # %bb.0: 294; CSKY-NEXT: subi16 sp, sp, 4 295; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 296; CSKY-NEXT: subi16 sp, sp, 8 297; CSKY-NEXT: st32.h a1, (sp, 6) 298; CSKY-NEXT: movi16 a1, 0 299; CSKY-NEXT: st16.w a1, (sp, 0) 300; CSKY-NEXT: addi32 a1, sp, 6 301; CSKY-NEXT: movi16 a3, 2 302; CSKY-NEXT: jsri32 [.LCPI11_0] 303; CSKY-NEXT: addi16 sp, sp, 8 304; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 305; CSKY-NEXT: addi16 sp, sp, 4 306; CSKY-NEXT: rts16 307; CSKY-NEXT: .p2align 1 308; CSKY-NEXT: # %bb.1: 309; CSKY-NEXT: .p2align 2 310; CSKY-NEXT: .LCPI11_0: 311; CSKY-NEXT: .long __atomic_compare_exchange_2 312; 313 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire monotonic 314 ret void 315} 316 317define void @cmpxchg_i16_acquire_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind { 318; CSKY-LABEL: cmpxchg_i16_acquire_acquire: 319; CSKY: # %bb.0: 320; CSKY-NEXT: subi16 sp, sp, 4 321; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 322; CSKY-NEXT: subi16 sp, sp, 8 323; CSKY-NEXT: st32.h a1, (sp, 6) 324; CSKY-NEXT: movi16 a1, 2 325; CSKY-NEXT: st16.w a1, (sp, 0) 326; CSKY-NEXT: addi32 a1, sp, 6 327; CSKY-NEXT: movi16 a3, 2 328; CSKY-NEXT: jsri32 [.LCPI12_0] 329; CSKY-NEXT: addi16 sp, sp, 8 330; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 331; CSKY-NEXT: addi16 sp, sp, 4 332; CSKY-NEXT: rts16 333; CSKY-NEXT: .p2align 1 334; CSKY-NEXT: # %bb.1: 335; CSKY-NEXT: .p2align 2 336; CSKY-NEXT: .LCPI12_0: 337; CSKY-NEXT: .long __atomic_compare_exchange_2 338; 339 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acquire acquire 340 ret void 341} 342 343define void @cmpxchg_i16_release_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 344; CSKY-LABEL: cmpxchg_i16_release_monotonic: 345; CSKY: # %bb.0: 346; CSKY-NEXT: subi16 sp, sp, 4 347; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 348; CSKY-NEXT: subi16 sp, sp, 8 349; CSKY-NEXT: st32.h a1, (sp, 6) 350; CSKY-NEXT: movi16 a1, 0 351; CSKY-NEXT: st16.w a1, (sp, 0) 352; CSKY-NEXT: addi32 a1, sp, 6 353; CSKY-NEXT: movi16 a3, 3 354; CSKY-NEXT: jsri32 [.LCPI13_0] 355; CSKY-NEXT: addi16 sp, sp, 8 356; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 357; CSKY-NEXT: addi16 sp, sp, 4 358; CSKY-NEXT: rts16 359; CSKY-NEXT: .p2align 1 360; CSKY-NEXT: # %bb.1: 361; CSKY-NEXT: .p2align 2 362; CSKY-NEXT: .LCPI13_0: 363; CSKY-NEXT: .long __atomic_compare_exchange_2 364; 365 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val release monotonic 366 ret void 367} 368 369define void @cmpxchg_i16_release_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind { 370; CSKY-LABEL: cmpxchg_i16_release_acquire: 371; CSKY: # %bb.0: 372; CSKY-NEXT: subi16 sp, sp, 4 373; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 374; CSKY-NEXT: subi16 sp, sp, 8 375; CSKY-NEXT: st32.h a1, (sp, 6) 376; CSKY-NEXT: movi16 a1, 2 377; CSKY-NEXT: st16.w a1, (sp, 0) 378; CSKY-NEXT: addi32 a1, sp, 6 379; CSKY-NEXT: movi16 a3, 3 380; CSKY-NEXT: jsri32 [.LCPI14_0] 381; CSKY-NEXT: addi16 sp, sp, 8 382; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 383; CSKY-NEXT: addi16 sp, sp, 4 384; CSKY-NEXT: rts16 385; CSKY-NEXT: .p2align 1 386; CSKY-NEXT: # %bb.1: 387; CSKY-NEXT: .p2align 2 388; CSKY-NEXT: .LCPI14_0: 389; CSKY-NEXT: .long __atomic_compare_exchange_2 390; 391 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val release acquire 392 ret void 393} 394 395define void @cmpxchg_i16_acq_rel_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 396; CSKY-LABEL: cmpxchg_i16_acq_rel_monotonic: 397; CSKY: # %bb.0: 398; CSKY-NEXT: subi16 sp, sp, 4 399; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 400; CSKY-NEXT: subi16 sp, sp, 8 401; CSKY-NEXT: st32.h a1, (sp, 6) 402; CSKY-NEXT: movi16 a1, 0 403; CSKY-NEXT: st16.w a1, (sp, 0) 404; CSKY-NEXT: addi32 a1, sp, 6 405; CSKY-NEXT: movi16 a3, 4 406; CSKY-NEXT: jsri32 [.LCPI15_0] 407; CSKY-NEXT: addi16 sp, sp, 8 408; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 409; CSKY-NEXT: addi16 sp, sp, 4 410; CSKY-NEXT: rts16 411; CSKY-NEXT: .p2align 1 412; CSKY-NEXT: # %bb.1: 413; CSKY-NEXT: .p2align 2 414; CSKY-NEXT: .LCPI15_0: 415; CSKY-NEXT: .long __atomic_compare_exchange_2 416; 417 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acq_rel monotonic 418 ret void 419} 420 421define void @cmpxchg_i16_acq_rel_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind { 422; CSKY-LABEL: cmpxchg_i16_acq_rel_acquire: 423; CSKY: # %bb.0: 424; CSKY-NEXT: subi16 sp, sp, 4 425; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 426; CSKY-NEXT: subi16 sp, sp, 8 427; CSKY-NEXT: st32.h a1, (sp, 6) 428; CSKY-NEXT: movi16 a1, 2 429; CSKY-NEXT: st16.w a1, (sp, 0) 430; CSKY-NEXT: addi32 a1, sp, 6 431; CSKY-NEXT: movi16 a3, 4 432; CSKY-NEXT: jsri32 [.LCPI16_0] 433; CSKY-NEXT: addi16 sp, sp, 8 434; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 435; CSKY-NEXT: addi16 sp, sp, 4 436; CSKY-NEXT: rts16 437; CSKY-NEXT: .p2align 1 438; CSKY-NEXT: # %bb.1: 439; CSKY-NEXT: .p2align 2 440; CSKY-NEXT: .LCPI16_0: 441; CSKY-NEXT: .long __atomic_compare_exchange_2 442; 443 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val acq_rel acquire 444 ret void 445} 446 447define void @cmpxchg_i16_seq_cst_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind { 448; CSKY-LABEL: cmpxchg_i16_seq_cst_monotonic: 449; CSKY: # %bb.0: 450; CSKY-NEXT: subi16 sp, sp, 4 451; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 452; CSKY-NEXT: subi16 sp, sp, 8 453; CSKY-NEXT: st32.h a1, (sp, 6) 454; CSKY-NEXT: movi16 a1, 0 455; CSKY-NEXT: st16.w a1, (sp, 0) 456; CSKY-NEXT: addi32 a1, sp, 6 457; CSKY-NEXT: movi16 a3, 5 458; CSKY-NEXT: jsri32 [.LCPI17_0] 459; CSKY-NEXT: addi16 sp, sp, 8 460; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 461; CSKY-NEXT: addi16 sp, sp, 4 462; CSKY-NEXT: rts16 463; CSKY-NEXT: .p2align 1 464; CSKY-NEXT: # %bb.1: 465; CSKY-NEXT: .p2align 2 466; CSKY-NEXT: .LCPI17_0: 467; CSKY-NEXT: .long __atomic_compare_exchange_2 468; 469 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst monotonic 470 ret void 471} 472 473define void @cmpxchg_i16_seq_cst_acquire(ptr %ptr, i16 %cmp, i16 %val) nounwind { 474; CSKY-LABEL: cmpxchg_i16_seq_cst_acquire: 475; CSKY: # %bb.0: 476; CSKY-NEXT: subi16 sp, sp, 4 477; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 478; CSKY-NEXT: subi16 sp, sp, 8 479; CSKY-NEXT: st32.h a1, (sp, 6) 480; CSKY-NEXT: movi16 a1, 2 481; CSKY-NEXT: st16.w a1, (sp, 0) 482; CSKY-NEXT: addi32 a1, sp, 6 483; CSKY-NEXT: movi16 a3, 5 484; CSKY-NEXT: jsri32 [.LCPI18_0] 485; CSKY-NEXT: addi16 sp, sp, 8 486; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 487; CSKY-NEXT: addi16 sp, sp, 4 488; CSKY-NEXT: rts16 489; CSKY-NEXT: .p2align 1 490; CSKY-NEXT: # %bb.1: 491; CSKY-NEXT: .p2align 2 492; CSKY-NEXT: .LCPI18_0: 493; CSKY-NEXT: .long __atomic_compare_exchange_2 494; 495 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst acquire 496 ret void 497} 498 499define void @cmpxchg_i16_seq_cst_seq_cst(ptr %ptr, i16 %cmp, i16 %val) nounwind { 500; CSKY-LABEL: cmpxchg_i16_seq_cst_seq_cst: 501; CSKY: # %bb.0: 502; CSKY-NEXT: subi16 sp, sp, 4 503; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 504; CSKY-NEXT: subi16 sp, sp, 8 505; CSKY-NEXT: st32.h a1, (sp, 6) 506; CSKY-NEXT: movi16 a1, 5 507; CSKY-NEXT: st16.w a1, (sp, 0) 508; CSKY-NEXT: addi32 a1, sp, 6 509; CSKY-NEXT: movi16 a3, 5 510; CSKY-NEXT: jsri32 [.LCPI19_0] 511; CSKY-NEXT: addi16 sp, sp, 8 512; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 513; CSKY-NEXT: addi16 sp, sp, 4 514; CSKY-NEXT: rts16 515; CSKY-NEXT: .p2align 1 516; CSKY-NEXT: # %bb.1: 517; CSKY-NEXT: .p2align 2 518; CSKY-NEXT: .LCPI19_0: 519; CSKY-NEXT: .long __atomic_compare_exchange_2 520; 521 %res = cmpxchg ptr %ptr, i16 %cmp, i16 %val seq_cst seq_cst 522 ret void 523} 524 525define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 526; CSKY-LABEL: cmpxchg_i32_monotonic_monotonic: 527; CSKY: # %bb.0: 528; CSKY-NEXT: subi16 sp, sp, 4 529; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 530; CSKY-NEXT: subi16 sp, sp, 8 531; CSKY-NEXT: st16.w a1, (sp, 4) 532; CSKY-NEXT: movi16 a1, 0 533; CSKY-NEXT: st16.w a1, (sp, 0) 534; CSKY-NEXT: addi16 a1, sp, 4 535; CSKY-NEXT: movi16 a3, 0 536; CSKY-NEXT: jsri32 [.LCPI20_0] 537; CSKY-NEXT: addi16 sp, sp, 8 538; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 539; CSKY-NEXT: addi16 sp, sp, 4 540; CSKY-NEXT: rts16 541; CSKY-NEXT: .p2align 1 542; CSKY-NEXT: # %bb.1: 543; CSKY-NEXT: .p2align 2 544; CSKY-NEXT: .LCPI20_0: 545; CSKY-NEXT: .long __atomic_compare_exchange_4 546; 547 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic 548 ret void 549} 550 551define void @cmpxchg_i32_acquire_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 552; CSKY-LABEL: cmpxchg_i32_acquire_monotonic: 553; CSKY: # %bb.0: 554; CSKY-NEXT: subi16 sp, sp, 4 555; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 556; CSKY-NEXT: subi16 sp, sp, 8 557; CSKY-NEXT: st16.w a1, (sp, 4) 558; CSKY-NEXT: movi16 a1, 0 559; CSKY-NEXT: st16.w a1, (sp, 0) 560; CSKY-NEXT: addi16 a1, sp, 4 561; CSKY-NEXT: movi16 a3, 2 562; CSKY-NEXT: jsri32 [.LCPI21_0] 563; CSKY-NEXT: addi16 sp, sp, 8 564; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 565; CSKY-NEXT: addi16 sp, sp, 4 566; CSKY-NEXT: rts16 567; CSKY-NEXT: .p2align 1 568; CSKY-NEXT: # %bb.1: 569; CSKY-NEXT: .p2align 2 570; CSKY-NEXT: .LCPI21_0: 571; CSKY-NEXT: .long __atomic_compare_exchange_4 572; 573 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire monotonic 574 ret void 575} 576 577define void @cmpxchg_i32_acquire_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind { 578; CSKY-LABEL: cmpxchg_i32_acquire_acquire: 579; CSKY: # %bb.0: 580; CSKY-NEXT: subi16 sp, sp, 4 581; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 582; CSKY-NEXT: subi16 sp, sp, 8 583; CSKY-NEXT: st16.w a1, (sp, 4) 584; CSKY-NEXT: movi16 a1, 2 585; CSKY-NEXT: st16.w a1, (sp, 0) 586; CSKY-NEXT: addi16 a1, sp, 4 587; CSKY-NEXT: movi16 a3, 2 588; CSKY-NEXT: jsri32 [.LCPI22_0] 589; CSKY-NEXT: addi16 sp, sp, 8 590; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 591; CSKY-NEXT: addi16 sp, sp, 4 592; CSKY-NEXT: rts16 593; CSKY-NEXT: .p2align 1 594; CSKY-NEXT: # %bb.1: 595; CSKY-NEXT: .p2align 2 596; CSKY-NEXT: .LCPI22_0: 597; CSKY-NEXT: .long __atomic_compare_exchange_4 598; 599 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acquire acquire 600 ret void 601} 602 603define void @cmpxchg_i32_release_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 604; CSKY-LABEL: cmpxchg_i32_release_monotonic: 605; CSKY: # %bb.0: 606; CSKY-NEXT: subi16 sp, sp, 4 607; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 608; CSKY-NEXT: subi16 sp, sp, 8 609; CSKY-NEXT: st16.w a1, (sp, 4) 610; CSKY-NEXT: movi16 a1, 0 611; CSKY-NEXT: st16.w a1, (sp, 0) 612; CSKY-NEXT: addi16 a1, sp, 4 613; CSKY-NEXT: movi16 a3, 3 614; CSKY-NEXT: jsri32 [.LCPI23_0] 615; CSKY-NEXT: addi16 sp, sp, 8 616; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 617; CSKY-NEXT: addi16 sp, sp, 4 618; CSKY-NEXT: rts16 619; CSKY-NEXT: .p2align 1 620; CSKY-NEXT: # %bb.1: 621; CSKY-NEXT: .p2align 2 622; CSKY-NEXT: .LCPI23_0: 623; CSKY-NEXT: .long __atomic_compare_exchange_4 624; 625 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val release monotonic 626 ret void 627} 628 629define void @cmpxchg_i32_release_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind { 630; CSKY-LABEL: cmpxchg_i32_release_acquire: 631; CSKY: # %bb.0: 632; CSKY-NEXT: subi16 sp, sp, 4 633; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 634; CSKY-NEXT: subi16 sp, sp, 8 635; CSKY-NEXT: st16.w a1, (sp, 4) 636; CSKY-NEXT: movi16 a1, 2 637; CSKY-NEXT: st16.w a1, (sp, 0) 638; CSKY-NEXT: addi16 a1, sp, 4 639; CSKY-NEXT: movi16 a3, 3 640; CSKY-NEXT: jsri32 [.LCPI24_0] 641; CSKY-NEXT: addi16 sp, sp, 8 642; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 643; CSKY-NEXT: addi16 sp, sp, 4 644; CSKY-NEXT: rts16 645; CSKY-NEXT: .p2align 1 646; CSKY-NEXT: # %bb.1: 647; CSKY-NEXT: .p2align 2 648; CSKY-NEXT: .LCPI24_0: 649; CSKY-NEXT: .long __atomic_compare_exchange_4 650; 651 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val release acquire 652 ret void 653} 654 655define void @cmpxchg_i32_acq_rel_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 656; CSKY-LABEL: cmpxchg_i32_acq_rel_monotonic: 657; CSKY: # %bb.0: 658; CSKY-NEXT: subi16 sp, sp, 4 659; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 660; CSKY-NEXT: subi16 sp, sp, 8 661; CSKY-NEXT: st16.w a1, (sp, 4) 662; CSKY-NEXT: movi16 a1, 0 663; CSKY-NEXT: st16.w a1, (sp, 0) 664; CSKY-NEXT: addi16 a1, sp, 4 665; CSKY-NEXT: movi16 a3, 4 666; CSKY-NEXT: jsri32 [.LCPI25_0] 667; CSKY-NEXT: addi16 sp, sp, 8 668; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 669; CSKY-NEXT: addi16 sp, sp, 4 670; CSKY-NEXT: rts16 671; CSKY-NEXT: .p2align 1 672; CSKY-NEXT: # %bb.1: 673; CSKY-NEXT: .p2align 2 674; CSKY-NEXT: .LCPI25_0: 675; CSKY-NEXT: .long __atomic_compare_exchange_4 676; 677 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acq_rel monotonic 678 ret void 679} 680 681define void @cmpxchg_i32_acq_rel_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind { 682; CSKY-LABEL: cmpxchg_i32_acq_rel_acquire: 683; CSKY: # %bb.0: 684; CSKY-NEXT: subi16 sp, sp, 4 685; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 686; CSKY-NEXT: subi16 sp, sp, 8 687; CSKY-NEXT: st16.w a1, (sp, 4) 688; CSKY-NEXT: movi16 a1, 2 689; CSKY-NEXT: st16.w a1, (sp, 0) 690; CSKY-NEXT: addi16 a1, sp, 4 691; CSKY-NEXT: movi16 a3, 4 692; CSKY-NEXT: jsri32 [.LCPI26_0] 693; CSKY-NEXT: addi16 sp, sp, 8 694; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 695; CSKY-NEXT: addi16 sp, sp, 4 696; CSKY-NEXT: rts16 697; CSKY-NEXT: .p2align 1 698; CSKY-NEXT: # %bb.1: 699; CSKY-NEXT: .p2align 2 700; CSKY-NEXT: .LCPI26_0: 701; CSKY-NEXT: .long __atomic_compare_exchange_4 702; 703 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val acq_rel acquire 704 ret void 705} 706 707define void @cmpxchg_i32_seq_cst_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind { 708; CSKY-LABEL: cmpxchg_i32_seq_cst_monotonic: 709; CSKY: # %bb.0: 710; CSKY-NEXT: subi16 sp, sp, 4 711; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 712; CSKY-NEXT: subi16 sp, sp, 8 713; CSKY-NEXT: st16.w a1, (sp, 4) 714; CSKY-NEXT: movi16 a1, 0 715; CSKY-NEXT: st16.w a1, (sp, 0) 716; CSKY-NEXT: addi16 a1, sp, 4 717; CSKY-NEXT: movi16 a3, 5 718; CSKY-NEXT: jsri32 [.LCPI27_0] 719; CSKY-NEXT: addi16 sp, sp, 8 720; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 721; CSKY-NEXT: addi16 sp, sp, 4 722; CSKY-NEXT: rts16 723; CSKY-NEXT: .p2align 1 724; CSKY-NEXT: # %bb.1: 725; CSKY-NEXT: .p2align 2 726; CSKY-NEXT: .LCPI27_0: 727; CSKY-NEXT: .long __atomic_compare_exchange_4 728; 729 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst monotonic 730 ret void 731} 732 733define void @cmpxchg_i32_seq_cst_acquire(ptr %ptr, i32 %cmp, i32 %val) nounwind { 734; CSKY-LABEL: cmpxchg_i32_seq_cst_acquire: 735; CSKY: # %bb.0: 736; CSKY-NEXT: subi16 sp, sp, 4 737; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 738; CSKY-NEXT: subi16 sp, sp, 8 739; CSKY-NEXT: st16.w a1, (sp, 4) 740; CSKY-NEXT: movi16 a1, 2 741; CSKY-NEXT: st16.w a1, (sp, 0) 742; CSKY-NEXT: addi16 a1, sp, 4 743; CSKY-NEXT: movi16 a3, 5 744; CSKY-NEXT: jsri32 [.LCPI28_0] 745; CSKY-NEXT: addi16 sp, sp, 8 746; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 747; CSKY-NEXT: addi16 sp, sp, 4 748; CSKY-NEXT: rts16 749; CSKY-NEXT: .p2align 1 750; CSKY-NEXT: # %bb.1: 751; CSKY-NEXT: .p2align 2 752; CSKY-NEXT: .LCPI28_0: 753; CSKY-NEXT: .long __atomic_compare_exchange_4 754; 755 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst acquire 756 ret void 757} 758 759define void @cmpxchg_i32_seq_cst_seq_cst(ptr %ptr, i32 %cmp, i32 %val) nounwind { 760; CSKY-LABEL: cmpxchg_i32_seq_cst_seq_cst: 761; CSKY: # %bb.0: 762; CSKY-NEXT: subi16 sp, sp, 4 763; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 764; CSKY-NEXT: subi16 sp, sp, 8 765; CSKY-NEXT: st16.w a1, (sp, 4) 766; CSKY-NEXT: movi16 a1, 5 767; CSKY-NEXT: st16.w a1, (sp, 0) 768; CSKY-NEXT: addi16 a1, sp, 4 769; CSKY-NEXT: movi16 a3, 5 770; CSKY-NEXT: jsri32 [.LCPI29_0] 771; CSKY-NEXT: addi16 sp, sp, 8 772; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 773; CSKY-NEXT: addi16 sp, sp, 4 774; CSKY-NEXT: rts16 775; CSKY-NEXT: .p2align 1 776; CSKY-NEXT: # %bb.1: 777; CSKY-NEXT: .p2align 2 778; CSKY-NEXT: .LCPI29_0: 779; CSKY-NEXT: .long __atomic_compare_exchange_4 780; 781 %res = cmpxchg ptr %ptr, i32 %cmp, i32 %val seq_cst seq_cst 782 ret void 783} 784 785define void @cmpxchg_i64_monotonic_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 786; CSKY-LABEL: cmpxchg_i64_monotonic_monotonic: 787; CSKY: # %bb.0: 788; CSKY-NEXT: subi16 sp, sp, 4 789; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 790; CSKY-NEXT: subi16 sp, sp, 16 791; CSKY-NEXT: mov16 t0, a3 792; CSKY-NEXT: ld16.w a3, (sp, 20) 793; CSKY-NEXT: st16.w a2, (sp, 12) 794; CSKY-NEXT: st16.w a1, (sp, 8) 795; CSKY-NEXT: movi16 a1, 0 796; CSKY-NEXT: st16.w a1, (sp, 4) 797; CSKY-NEXT: st16.w a1, (sp, 0) 798; CSKY-NEXT: addi16 a1, sp, 8 799; CSKY-NEXT: mov16 a2, t0 800; CSKY-NEXT: jsri32 [.LCPI30_0] 801; CSKY-NEXT: addi16 sp, sp, 16 802; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 803; CSKY-NEXT: addi16 sp, sp, 4 804; CSKY-NEXT: rts16 805; CSKY-NEXT: .p2align 1 806; CSKY-NEXT: # %bb.1: 807; CSKY-NEXT: .p2align 2 808; CSKY-NEXT: .LCPI30_0: 809; CSKY-NEXT: .long __atomic_compare_exchange_8 810; 811 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic 812 ret void 813} 814 815define void @cmpxchg_i64_acquire_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 816; CSKY-LABEL: cmpxchg_i64_acquire_monotonic: 817; CSKY: # %bb.0: 818; CSKY-NEXT: subi16 sp, sp, 4 819; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 820; CSKY-NEXT: subi16 sp, sp, 16 821; CSKY-NEXT: mov16 t0, a3 822; CSKY-NEXT: ld16.w a3, (sp, 20) 823; CSKY-NEXT: st16.w a2, (sp, 12) 824; CSKY-NEXT: st16.w a1, (sp, 8) 825; CSKY-NEXT: movi16 a1, 0 826; CSKY-NEXT: st16.w a1, (sp, 4) 827; CSKY-NEXT: movi16 a1, 2 828; CSKY-NEXT: st16.w a1, (sp, 0) 829; CSKY-NEXT: addi16 a1, sp, 8 830; CSKY-NEXT: mov16 a2, t0 831; CSKY-NEXT: jsri32 [.LCPI31_0] 832; CSKY-NEXT: addi16 sp, sp, 16 833; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 834; CSKY-NEXT: addi16 sp, sp, 4 835; CSKY-NEXT: rts16 836; CSKY-NEXT: .p2align 1 837; CSKY-NEXT: # %bb.1: 838; CSKY-NEXT: .p2align 2 839; CSKY-NEXT: .LCPI31_0: 840; CSKY-NEXT: .long __atomic_compare_exchange_8 841; 842 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire monotonic 843 ret void 844} 845 846define void @cmpxchg_i64_acquire_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind { 847; CSKY-LABEL: cmpxchg_i64_acquire_acquire: 848; CSKY: # %bb.0: 849; CSKY-NEXT: subi16 sp, sp, 4 850; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 851; CSKY-NEXT: subi16 sp, sp, 16 852; CSKY-NEXT: mov16 t0, a3 853; CSKY-NEXT: ld16.w a3, (sp, 20) 854; CSKY-NEXT: st16.w a2, (sp, 12) 855; CSKY-NEXT: st16.w a1, (sp, 8) 856; CSKY-NEXT: movi16 a1, 2 857; CSKY-NEXT: st16.w a1, (sp, 4) 858; CSKY-NEXT: st16.w a1, (sp, 0) 859; CSKY-NEXT: addi16 a1, sp, 8 860; CSKY-NEXT: mov16 a2, t0 861; CSKY-NEXT: jsri32 [.LCPI32_0] 862; CSKY-NEXT: addi16 sp, sp, 16 863; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 864; CSKY-NEXT: addi16 sp, sp, 4 865; CSKY-NEXT: rts16 866; CSKY-NEXT: .p2align 1 867; CSKY-NEXT: # %bb.1: 868; CSKY-NEXT: .p2align 2 869; CSKY-NEXT: .LCPI32_0: 870; CSKY-NEXT: .long __atomic_compare_exchange_8 871; 872 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acquire acquire 873 ret void 874} 875 876define void @cmpxchg_i64_release_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 877; CSKY-LABEL: cmpxchg_i64_release_monotonic: 878; CSKY: # %bb.0: 879; CSKY-NEXT: subi16 sp, sp, 4 880; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 881; CSKY-NEXT: subi16 sp, sp, 16 882; CSKY-NEXT: mov16 t0, a3 883; CSKY-NEXT: ld16.w a3, (sp, 20) 884; CSKY-NEXT: st16.w a2, (sp, 12) 885; CSKY-NEXT: st16.w a1, (sp, 8) 886; CSKY-NEXT: movi16 a1, 0 887; CSKY-NEXT: st16.w a1, (sp, 4) 888; CSKY-NEXT: movi16 a1, 3 889; CSKY-NEXT: st16.w a1, (sp, 0) 890; CSKY-NEXT: addi16 a1, sp, 8 891; CSKY-NEXT: mov16 a2, t0 892; CSKY-NEXT: jsri32 [.LCPI33_0] 893; CSKY-NEXT: addi16 sp, sp, 16 894; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 895; CSKY-NEXT: addi16 sp, sp, 4 896; CSKY-NEXT: rts16 897; CSKY-NEXT: .p2align 1 898; CSKY-NEXT: # %bb.1: 899; CSKY-NEXT: .p2align 2 900; CSKY-NEXT: .LCPI33_0: 901; CSKY-NEXT: .long __atomic_compare_exchange_8 902; 903 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val release monotonic 904 ret void 905} 906 907define void @cmpxchg_i64_release_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind { 908; CSKY-LABEL: cmpxchg_i64_release_acquire: 909; CSKY: # %bb.0: 910; CSKY-NEXT: subi16 sp, sp, 4 911; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 912; CSKY-NEXT: subi16 sp, sp, 16 913; CSKY-NEXT: mov16 t0, a3 914; CSKY-NEXT: ld16.w a3, (sp, 20) 915; CSKY-NEXT: st16.w a2, (sp, 12) 916; CSKY-NEXT: st16.w a1, (sp, 8) 917; CSKY-NEXT: movi16 a1, 2 918; CSKY-NEXT: st16.w a1, (sp, 4) 919; CSKY-NEXT: movi16 a1, 3 920; CSKY-NEXT: st16.w a1, (sp, 0) 921; CSKY-NEXT: addi16 a1, sp, 8 922; CSKY-NEXT: mov16 a2, t0 923; CSKY-NEXT: jsri32 [.LCPI34_0] 924; CSKY-NEXT: addi16 sp, sp, 16 925; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 926; CSKY-NEXT: addi16 sp, sp, 4 927; CSKY-NEXT: rts16 928; CSKY-NEXT: .p2align 1 929; CSKY-NEXT: # %bb.1: 930; CSKY-NEXT: .p2align 2 931; CSKY-NEXT: .LCPI34_0: 932; CSKY-NEXT: .long __atomic_compare_exchange_8 933; 934 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val release acquire 935 ret void 936} 937 938define void @cmpxchg_i64_acq_rel_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 939; CSKY-LABEL: cmpxchg_i64_acq_rel_monotonic: 940; CSKY: # %bb.0: 941; CSKY-NEXT: subi16 sp, sp, 4 942; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 943; CSKY-NEXT: subi16 sp, sp, 16 944; CSKY-NEXT: mov16 t0, a3 945; CSKY-NEXT: ld16.w a3, (sp, 20) 946; CSKY-NEXT: st16.w a2, (sp, 12) 947; CSKY-NEXT: st16.w a1, (sp, 8) 948; CSKY-NEXT: movi16 a1, 0 949; CSKY-NEXT: st16.w a1, (sp, 4) 950; CSKY-NEXT: movi16 a1, 4 951; CSKY-NEXT: st16.w a1, (sp, 0) 952; CSKY-NEXT: addi16 a1, sp, 8 953; CSKY-NEXT: mov16 a2, t0 954; CSKY-NEXT: jsri32 [.LCPI35_0] 955; CSKY-NEXT: addi16 sp, sp, 16 956; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 957; CSKY-NEXT: addi16 sp, sp, 4 958; CSKY-NEXT: rts16 959; CSKY-NEXT: .p2align 1 960; CSKY-NEXT: # %bb.1: 961; CSKY-NEXT: .p2align 2 962; CSKY-NEXT: .LCPI35_0: 963; CSKY-NEXT: .long __atomic_compare_exchange_8 964; 965 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acq_rel monotonic 966 ret void 967} 968 969define void @cmpxchg_i64_acq_rel_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind { 970; CSKY-LABEL: cmpxchg_i64_acq_rel_acquire: 971; CSKY: # %bb.0: 972; CSKY-NEXT: subi16 sp, sp, 4 973; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 974; CSKY-NEXT: subi16 sp, sp, 16 975; CSKY-NEXT: mov16 t0, a3 976; CSKY-NEXT: ld16.w a3, (sp, 20) 977; CSKY-NEXT: st16.w a2, (sp, 12) 978; CSKY-NEXT: st16.w a1, (sp, 8) 979; CSKY-NEXT: movi16 a1, 2 980; CSKY-NEXT: st16.w a1, (sp, 4) 981; CSKY-NEXT: movi16 a1, 4 982; CSKY-NEXT: st16.w a1, (sp, 0) 983; CSKY-NEXT: addi16 a1, sp, 8 984; CSKY-NEXT: mov16 a2, t0 985; CSKY-NEXT: jsri32 [.LCPI36_0] 986; CSKY-NEXT: addi16 sp, sp, 16 987; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 988; CSKY-NEXT: addi16 sp, sp, 4 989; CSKY-NEXT: rts16 990; CSKY-NEXT: .p2align 1 991; CSKY-NEXT: # %bb.1: 992; CSKY-NEXT: .p2align 2 993; CSKY-NEXT: .LCPI36_0: 994; CSKY-NEXT: .long __atomic_compare_exchange_8 995; 996 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val acq_rel acquire 997 ret void 998} 999 1000define void @cmpxchg_i64_seq_cst_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind { 1001; CSKY-LABEL: cmpxchg_i64_seq_cst_monotonic: 1002; CSKY: # %bb.0: 1003; CSKY-NEXT: subi16 sp, sp, 4 1004; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 1005; CSKY-NEXT: subi16 sp, sp, 16 1006; CSKY-NEXT: mov16 t0, a3 1007; CSKY-NEXT: ld16.w a3, (sp, 20) 1008; CSKY-NEXT: st16.w a2, (sp, 12) 1009; CSKY-NEXT: st16.w a1, (sp, 8) 1010; CSKY-NEXT: movi16 a1, 0 1011; CSKY-NEXT: st16.w a1, (sp, 4) 1012; CSKY-NEXT: movi16 a1, 5 1013; CSKY-NEXT: st16.w a1, (sp, 0) 1014; CSKY-NEXT: addi16 a1, sp, 8 1015; CSKY-NEXT: mov16 a2, t0 1016; CSKY-NEXT: jsri32 [.LCPI37_0] 1017; CSKY-NEXT: addi16 sp, sp, 16 1018; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 1019; CSKY-NEXT: addi16 sp, sp, 4 1020; CSKY-NEXT: rts16 1021; CSKY-NEXT: .p2align 1 1022; CSKY-NEXT: # %bb.1: 1023; CSKY-NEXT: .p2align 2 1024; CSKY-NEXT: .LCPI37_0: 1025; CSKY-NEXT: .long __atomic_compare_exchange_8 1026; 1027 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst monotonic 1028 ret void 1029} 1030 1031define void @cmpxchg_i64_seq_cst_acquire(ptr %ptr, i64 %cmp, i64 %val) nounwind { 1032; CSKY-LABEL: cmpxchg_i64_seq_cst_acquire: 1033; CSKY: # %bb.0: 1034; CSKY-NEXT: subi16 sp, sp, 4 1035; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 1036; CSKY-NEXT: subi16 sp, sp, 16 1037; CSKY-NEXT: mov16 t0, a3 1038; CSKY-NEXT: ld16.w a3, (sp, 20) 1039; CSKY-NEXT: st16.w a2, (sp, 12) 1040; CSKY-NEXT: st16.w a1, (sp, 8) 1041; CSKY-NEXT: movi16 a1, 2 1042; CSKY-NEXT: st16.w a1, (sp, 4) 1043; CSKY-NEXT: movi16 a1, 5 1044; CSKY-NEXT: st16.w a1, (sp, 0) 1045; CSKY-NEXT: addi16 a1, sp, 8 1046; CSKY-NEXT: mov16 a2, t0 1047; CSKY-NEXT: jsri32 [.LCPI38_0] 1048; CSKY-NEXT: addi16 sp, sp, 16 1049; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 1050; CSKY-NEXT: addi16 sp, sp, 4 1051; CSKY-NEXT: rts16 1052; CSKY-NEXT: .p2align 1 1053; CSKY-NEXT: # %bb.1: 1054; CSKY-NEXT: .p2align 2 1055; CSKY-NEXT: .LCPI38_0: 1056; CSKY-NEXT: .long __atomic_compare_exchange_8 1057; 1058 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst acquire 1059 ret void 1060} 1061 1062define void @cmpxchg_i64_seq_cst_seq_cst(ptr %ptr, i64 %cmp, i64 %val) nounwind { 1063; CSKY-LABEL: cmpxchg_i64_seq_cst_seq_cst: 1064; CSKY: # %bb.0: 1065; CSKY-NEXT: subi16 sp, sp, 4 1066; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 1067; CSKY-NEXT: subi16 sp, sp, 16 1068; CSKY-NEXT: mov16 t0, a3 1069; CSKY-NEXT: ld16.w a3, (sp, 20) 1070; CSKY-NEXT: st16.w a2, (sp, 12) 1071; CSKY-NEXT: st16.w a1, (sp, 8) 1072; CSKY-NEXT: movi16 a1, 5 1073; CSKY-NEXT: st16.w a1, (sp, 4) 1074; CSKY-NEXT: st16.w a1, (sp, 0) 1075; CSKY-NEXT: addi16 a1, sp, 8 1076; CSKY-NEXT: mov16 a2, t0 1077; CSKY-NEXT: jsri32 [.LCPI39_0] 1078; CSKY-NEXT: addi16 sp, sp, 16 1079; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 1080; CSKY-NEXT: addi16 sp, sp, 4 1081; CSKY-NEXT: rts16 1082; CSKY-NEXT: .p2align 1 1083; CSKY-NEXT: # %bb.1: 1084; CSKY-NEXT: .p2align 2 1085; CSKY-NEXT: .LCPI39_0: 1086; CSKY-NEXT: .long __atomic_compare_exchange_8 1087; 1088 %res = cmpxchg ptr %ptr, i64 %cmp, i64 %val seq_cst seq_cst 1089 ret void 1090} 1091