1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 4 5define i8 @load_acquire_i8(ptr %ptr) { 6; LA32-LABEL: load_acquire_i8: 7; LA32: # %bb.0: 8; LA32-NEXT: ld.b $a0, $a0, 0 9; LA32-NEXT: dbar 20 10; LA32-NEXT: ret 11; 12; LA64-LABEL: load_acquire_i8: 13; LA64: # %bb.0: 14; LA64-NEXT: ld.b $a0, $a0, 0 15; LA64-NEXT: dbar 20 16; LA64-NEXT: ret 17 %val = load atomic i8, ptr %ptr acquire, align 1 18 ret i8 %val 19} 20 21define i16 @load_acquire_i16(ptr %ptr) { 22; LA32-LABEL: load_acquire_i16: 23; LA32: # %bb.0: 24; LA32-NEXT: ld.h $a0, $a0, 0 25; LA32-NEXT: dbar 20 26; LA32-NEXT: ret 27; 28; LA64-LABEL: load_acquire_i16: 29; LA64: # %bb.0: 30; LA64-NEXT: ld.h $a0, $a0, 0 31; LA64-NEXT: dbar 20 32; LA64-NEXT: ret 33 %val = load atomic i16, ptr %ptr acquire, align 2 34 ret i16 %val 35} 36 37define i32 @load_acquire_i32(ptr %ptr) { 38; LA32-LABEL: load_acquire_i32: 39; LA32: # %bb.0: 40; LA32-NEXT: ld.w $a0, $a0, 0 41; LA32-NEXT: dbar 20 42; LA32-NEXT: ret 43; 44; LA64-LABEL: load_acquire_i32: 45; LA64: # %bb.0: 46; LA64-NEXT: ld.w $a0, $a0, 0 47; LA64-NEXT: dbar 20 48; LA64-NEXT: ret 49 %val = load atomic i32, ptr %ptr acquire, align 4 50 ret i32 %val 51} 52 53define i64 @load_acquire_i64(ptr %ptr) { 54; LA32-LABEL: load_acquire_i64: 55; LA32: # %bb.0: 56; LA32-NEXT: addi.w $sp, $sp, -16 57; LA32-NEXT: .cfi_def_cfa_offset 16 58; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 59; LA32-NEXT: .cfi_offset 1, -4 60; LA32-NEXT: ori $a1, $zero, 2 61; LA32-NEXT: bl %plt(__atomic_load_8) 62; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 63; LA32-NEXT: addi.w $sp, $sp, 16 64; LA32-NEXT: ret 65; 66; LA64-LABEL: load_acquire_i64: 67; LA64: # %bb.0: 68; LA64-NEXT: ld.d $a0, $a0, 0 69; LA64-NEXT: dbar 20 70; LA64-NEXT: ret 71 %val = load atomic i64, ptr %ptr acquire, align 8 72 ret i64 %val 73} 74 75define ptr @load_acquire_ptr(ptr %ptr) { 76; LA32-LABEL: load_acquire_ptr: 77; LA32: # %bb.0: 78; LA32-NEXT: ld.w $a0, $a0, 0 79; LA32-NEXT: dbar 20 80; LA32-NEXT: ret 81; 82; LA64-LABEL: load_acquire_ptr: 83; LA64: # %bb.0: 84; LA64-NEXT: ld.d $a0, $a0, 0 85; LA64-NEXT: dbar 20 86; LA64-NEXT: ret 87 %val = load atomic ptr, ptr %ptr acquire, align 8 88 ret ptr %val 89} 90 91define float @load_acquire_float(ptr %ptr) { 92; LA32-LABEL: load_acquire_float: 93; LA32: # %bb.0: 94; LA32-NEXT: ld.w $a0, $a0, 0 95; LA32-NEXT: movgr2fr.w $fa0, $a0 96; LA32-NEXT: dbar 20 97; LA32-NEXT: ret 98; 99; LA64-LABEL: load_acquire_float: 100; LA64: # %bb.0: 101; LA64-NEXT: ld.w $a0, $a0, 0 102; LA64-NEXT: movgr2fr.w $fa0, $a0 103; LA64-NEXT: dbar 20 104; LA64-NEXT: ret 105 %val = load atomic float, ptr %ptr acquire, align 8 106 ret float %val 107} 108 109define double @load_acquire_double(ptr %ptr) { 110; LA32-LABEL: load_acquire_double: 111; LA32: # %bb.0: 112; LA32-NEXT: addi.w $sp, $sp, -16 113; LA32-NEXT: .cfi_def_cfa_offset 16 114; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 115; LA32-NEXT: .cfi_offset 1, -4 116; LA32-NEXT: ori $a1, $zero, 2 117; LA32-NEXT: bl %plt(__atomic_load_8) 118; LA32-NEXT: st.w $a1, $sp, 4 119; LA32-NEXT: st.w $a0, $sp, 0 120; LA32-NEXT: fld.d $fa0, $sp, 0 121; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 122; LA32-NEXT: addi.w $sp, $sp, 16 123; LA32-NEXT: ret 124; 125; LA64-LABEL: load_acquire_double: 126; LA64: # %bb.0: 127; LA64-NEXT: ld.d $a0, $a0, 0 128; LA64-NEXT: movgr2fr.d $fa0, $a0 129; LA64-NEXT: dbar 20 130; LA64-NEXT: ret 131 %val = load atomic double, ptr %ptr acquire, align 8 132 ret double %val 133} 134 135define i8 @load_unordered_i8(ptr %ptr) { 136; LA32-LABEL: load_unordered_i8: 137; LA32: # %bb.0: 138; LA32-NEXT: ld.b $a0, $a0, 0 139; LA32-NEXT: ret 140; 141; LA64-LABEL: load_unordered_i8: 142; LA64: # %bb.0: 143; LA64-NEXT: ld.b $a0, $a0, 0 144; LA64-NEXT: ret 145 %val = load atomic i8, ptr %ptr unordered, align 1 146 ret i8 %val 147} 148 149define i16 @load_unordered_i16(ptr %ptr) { 150; LA32-LABEL: load_unordered_i16: 151; LA32: # %bb.0: 152; LA32-NEXT: ld.h $a0, $a0, 0 153; LA32-NEXT: ret 154; 155; LA64-LABEL: load_unordered_i16: 156; LA64: # %bb.0: 157; LA64-NEXT: ld.h $a0, $a0, 0 158; LA64-NEXT: ret 159 %val = load atomic i16, ptr %ptr unordered, align 2 160 ret i16 %val 161} 162 163define i32 @load_unordered_i32(ptr %ptr) { 164; LA32-LABEL: load_unordered_i32: 165; LA32: # %bb.0: 166; LA32-NEXT: ld.w $a0, $a0, 0 167; LA32-NEXT: ret 168; 169; LA64-LABEL: load_unordered_i32: 170; LA64: # %bb.0: 171; LA64-NEXT: ld.w $a0, $a0, 0 172; LA64-NEXT: ret 173 %val = load atomic i32, ptr %ptr unordered, align 4 174 ret i32 %val 175} 176 177define i64 @load_unordered_i64(ptr %ptr) { 178; LA32-LABEL: load_unordered_i64: 179; LA32: # %bb.0: 180; LA32-NEXT: addi.w $sp, $sp, -16 181; LA32-NEXT: .cfi_def_cfa_offset 16 182; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 183; LA32-NEXT: .cfi_offset 1, -4 184; LA32-NEXT: move $a1, $zero 185; LA32-NEXT: bl %plt(__atomic_load_8) 186; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 187; LA32-NEXT: addi.w $sp, $sp, 16 188; LA32-NEXT: ret 189; 190; LA64-LABEL: load_unordered_i64: 191; LA64: # %bb.0: 192; LA64-NEXT: ld.d $a0, $a0, 0 193; LA64-NEXT: ret 194 %val = load atomic i64, ptr %ptr unordered, align 8 195 ret i64 %val 196} 197 198define ptr @load_unordered_ptr(ptr %ptr) { 199; LA32-LABEL: load_unordered_ptr: 200; LA32: # %bb.0: 201; LA32-NEXT: ld.w $a0, $a0, 0 202; LA32-NEXT: ret 203; 204; LA64-LABEL: load_unordered_ptr: 205; LA64: # %bb.0: 206; LA64-NEXT: ld.d $a0, $a0, 0 207; LA64-NEXT: ret 208 %val = load atomic ptr, ptr %ptr unordered, align 8 209 ret ptr %val 210} 211 212define float @load_unordered_float(ptr %ptr) { 213; LA32-LABEL: load_unordered_float: 214; LA32: # %bb.0: 215; LA32-NEXT: ld.w $a0, $a0, 0 216; LA32-NEXT: movgr2fr.w $fa0, $a0 217; LA32-NEXT: ret 218; 219; LA64-LABEL: load_unordered_float: 220; LA64: # %bb.0: 221; LA64-NEXT: ld.w $a0, $a0, 0 222; LA64-NEXT: movgr2fr.w $fa0, $a0 223; LA64-NEXT: ret 224 %val = load atomic float, ptr %ptr unordered, align 8 225 ret float %val 226} 227 228define double @load_unordered_double(ptr %ptr) { 229; LA32-LABEL: load_unordered_double: 230; LA32: # %bb.0: 231; LA32-NEXT: addi.w $sp, $sp, -16 232; LA32-NEXT: .cfi_def_cfa_offset 16 233; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 234; LA32-NEXT: .cfi_offset 1, -4 235; LA32-NEXT: move $a1, $zero 236; LA32-NEXT: bl %plt(__atomic_load_8) 237; LA32-NEXT: st.w $a1, $sp, 4 238; LA32-NEXT: st.w $a0, $sp, 0 239; LA32-NEXT: fld.d $fa0, $sp, 0 240; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 241; LA32-NEXT: addi.w $sp, $sp, 16 242; LA32-NEXT: ret 243; 244; LA64-LABEL: load_unordered_double: 245; LA64: # %bb.0: 246; LA64-NEXT: ld.d $a0, $a0, 0 247; LA64-NEXT: movgr2fr.d $fa0, $a0 248; LA64-NEXT: ret 249 %val = load atomic double, ptr %ptr unordered, align 8 250 ret double %val 251} 252 253define i8 @load_monotonic_i8(ptr %ptr) { 254; LA32-LABEL: load_monotonic_i8: 255; LA32: # %bb.0: 256; LA32-NEXT: ld.b $a0, $a0, 0 257; LA32-NEXT: ret 258; 259; LA64-LABEL: load_monotonic_i8: 260; LA64: # %bb.0: 261; LA64-NEXT: ld.b $a0, $a0, 0 262; LA64-NEXT: ret 263 %val = load atomic i8, ptr %ptr monotonic, align 1 264 ret i8 %val 265} 266 267define i16 @load_monotonic_i16(ptr %ptr) { 268; LA32-LABEL: load_monotonic_i16: 269; LA32: # %bb.0: 270; LA32-NEXT: ld.h $a0, $a0, 0 271; LA32-NEXT: ret 272; 273; LA64-LABEL: load_monotonic_i16: 274; LA64: # %bb.0: 275; LA64-NEXT: ld.h $a0, $a0, 0 276; LA64-NEXT: ret 277 %val = load atomic i16, ptr %ptr monotonic, align 2 278 ret i16 %val 279} 280 281define i32 @load_monotonic_i32(ptr %ptr) { 282; LA32-LABEL: load_monotonic_i32: 283; LA32: # %bb.0: 284; LA32-NEXT: ld.w $a0, $a0, 0 285; LA32-NEXT: ret 286; 287; LA64-LABEL: load_monotonic_i32: 288; LA64: # %bb.0: 289; LA64-NEXT: ld.w $a0, $a0, 0 290; LA64-NEXT: ret 291 %val = load atomic i32, ptr %ptr monotonic, align 4 292 ret i32 %val 293} 294 295define i64 @load_monotonic_i64(ptr %ptr) { 296; LA32-LABEL: load_monotonic_i64: 297; LA32: # %bb.0: 298; LA32-NEXT: addi.w $sp, $sp, -16 299; LA32-NEXT: .cfi_def_cfa_offset 16 300; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 301; LA32-NEXT: .cfi_offset 1, -4 302; LA32-NEXT: move $a1, $zero 303; LA32-NEXT: bl %plt(__atomic_load_8) 304; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 305; LA32-NEXT: addi.w $sp, $sp, 16 306; LA32-NEXT: ret 307; 308; LA64-LABEL: load_monotonic_i64: 309; LA64: # %bb.0: 310; LA64-NEXT: ld.d $a0, $a0, 0 311; LA64-NEXT: ret 312 %val = load atomic i64, ptr %ptr monotonic, align 8 313 ret i64 %val 314} 315 316define ptr @load_monotonic_ptr(ptr %ptr) { 317; LA32-LABEL: load_monotonic_ptr: 318; LA32: # %bb.0: 319; LA32-NEXT: ld.w $a0, $a0, 0 320; LA32-NEXT: ret 321; 322; LA64-LABEL: load_monotonic_ptr: 323; LA64: # %bb.0: 324; LA64-NEXT: ld.d $a0, $a0, 0 325; LA64-NEXT: ret 326 %val = load atomic ptr, ptr %ptr monotonic, align 8 327 ret ptr %val 328} 329 330define float @load_monotonic_float(ptr %ptr) { 331; LA32-LABEL: load_monotonic_float: 332; LA32: # %bb.0: 333; LA32-NEXT: ld.w $a0, $a0, 0 334; LA32-NEXT: movgr2fr.w $fa0, $a0 335; LA32-NEXT: ret 336; 337; LA64-LABEL: load_monotonic_float: 338; LA64: # %bb.0: 339; LA64-NEXT: ld.w $a0, $a0, 0 340; LA64-NEXT: movgr2fr.w $fa0, $a0 341; LA64-NEXT: ret 342 %val = load atomic float, ptr %ptr monotonic, align 8 343 ret float %val 344} 345 346define double @load_monotonic_double(ptr %ptr) { 347; LA32-LABEL: load_monotonic_double: 348; LA32: # %bb.0: 349; LA32-NEXT: addi.w $sp, $sp, -16 350; LA32-NEXT: .cfi_def_cfa_offset 16 351; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 352; LA32-NEXT: .cfi_offset 1, -4 353; LA32-NEXT: move $a1, $zero 354; LA32-NEXT: bl %plt(__atomic_load_8) 355; LA32-NEXT: st.w $a1, $sp, 4 356; LA32-NEXT: st.w $a0, $sp, 0 357; LA32-NEXT: fld.d $fa0, $sp, 0 358; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 359; LA32-NEXT: addi.w $sp, $sp, 16 360; LA32-NEXT: ret 361; 362; LA64-LABEL: load_monotonic_double: 363; LA64: # %bb.0: 364; LA64-NEXT: ld.d $a0, $a0, 0 365; LA64-NEXT: movgr2fr.d $fa0, $a0 366; LA64-NEXT: ret 367 %val = load atomic double, ptr %ptr monotonic, align 8 368 ret double %val 369} 370 371define i8 @load_seq_cst_i8(ptr %ptr) { 372; LA32-LABEL: load_seq_cst_i8: 373; LA32: # %bb.0: 374; LA32-NEXT: ld.b $a0, $a0, 0 375; LA32-NEXT: dbar 16 376; LA32-NEXT: ret 377; 378; LA64-LABEL: load_seq_cst_i8: 379; LA64: # %bb.0: 380; LA64-NEXT: ld.b $a0, $a0, 0 381; LA64-NEXT: dbar 16 382; LA64-NEXT: ret 383 %val = load atomic i8, ptr %ptr seq_cst, align 1 384 ret i8 %val 385} 386 387define i16 @load_seq_cst_i16(ptr %ptr) { 388; LA32-LABEL: load_seq_cst_i16: 389; LA32: # %bb.0: 390; LA32-NEXT: ld.h $a0, $a0, 0 391; LA32-NEXT: dbar 16 392; LA32-NEXT: ret 393; 394; LA64-LABEL: load_seq_cst_i16: 395; LA64: # %bb.0: 396; LA64-NEXT: ld.h $a0, $a0, 0 397; LA64-NEXT: dbar 16 398; LA64-NEXT: ret 399 %val = load atomic i16, ptr %ptr seq_cst, align 2 400 ret i16 %val 401} 402 403define i32 @load_seq_cst_i32(ptr %ptr) { 404; LA32-LABEL: load_seq_cst_i32: 405; LA32: # %bb.0: 406; LA32-NEXT: ld.w $a0, $a0, 0 407; LA32-NEXT: dbar 16 408; LA32-NEXT: ret 409; 410; LA64-LABEL: load_seq_cst_i32: 411; LA64: # %bb.0: 412; LA64-NEXT: ld.w $a0, $a0, 0 413; LA64-NEXT: dbar 16 414; LA64-NEXT: ret 415 %val = load atomic i32, ptr %ptr seq_cst, align 4 416 ret i32 %val 417} 418 419define i64 @load_seq_cst_i64(ptr %ptr) { 420; LA32-LABEL: load_seq_cst_i64: 421; LA32: # %bb.0: 422; LA32-NEXT: addi.w $sp, $sp, -16 423; LA32-NEXT: .cfi_def_cfa_offset 16 424; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 425; LA32-NEXT: .cfi_offset 1, -4 426; LA32-NEXT: ori $a1, $zero, 5 427; LA32-NEXT: bl %plt(__atomic_load_8) 428; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 429; LA32-NEXT: addi.w $sp, $sp, 16 430; LA32-NEXT: ret 431; 432; LA64-LABEL: load_seq_cst_i64: 433; LA64: # %bb.0: 434; LA64-NEXT: ld.d $a0, $a0, 0 435; LA64-NEXT: dbar 16 436; LA64-NEXT: ret 437 %val = load atomic i64, ptr %ptr seq_cst, align 8 438 ret i64 %val 439} 440 441define ptr @load_seq_cst_ptr(ptr %ptr) { 442; LA32-LABEL: load_seq_cst_ptr: 443; LA32: # %bb.0: 444; LA32-NEXT: ld.w $a0, $a0, 0 445; LA32-NEXT: dbar 16 446; LA32-NEXT: ret 447; 448; LA64-LABEL: load_seq_cst_ptr: 449; LA64: # %bb.0: 450; LA64-NEXT: ld.d $a0, $a0, 0 451; LA64-NEXT: dbar 16 452; LA64-NEXT: ret 453 %val = load atomic ptr, ptr %ptr seq_cst, align 8 454 ret ptr %val 455} 456 457define float @load_seq_cst_float(ptr %ptr) { 458; LA32-LABEL: load_seq_cst_float: 459; LA32: # %bb.0: 460; LA32-NEXT: ld.w $a0, $a0, 0 461; LA32-NEXT: movgr2fr.w $fa0, $a0 462; LA32-NEXT: dbar 16 463; LA32-NEXT: ret 464; 465; LA64-LABEL: load_seq_cst_float: 466; LA64: # %bb.0: 467; LA64-NEXT: ld.w $a0, $a0, 0 468; LA64-NEXT: movgr2fr.w $fa0, $a0 469; LA64-NEXT: dbar 16 470; LA64-NEXT: ret 471 %val = load atomic float, ptr %ptr seq_cst, align 8 472 ret float %val 473} 474 475define double @load_seq_cst_double(ptr %ptr) { 476; LA32-LABEL: load_seq_cst_double: 477; LA32: # %bb.0: 478; LA32-NEXT: addi.w $sp, $sp, -16 479; LA32-NEXT: .cfi_def_cfa_offset 16 480; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 481; LA32-NEXT: .cfi_offset 1, -4 482; LA32-NEXT: ori $a1, $zero, 5 483; LA32-NEXT: bl %plt(__atomic_load_8) 484; LA32-NEXT: st.w $a1, $sp, 4 485; LA32-NEXT: st.w $a0, $sp, 0 486; LA32-NEXT: fld.d $fa0, $sp, 0 487; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 488; LA32-NEXT: addi.w $sp, $sp, 16 489; LA32-NEXT: ret 490; 491; LA64-LABEL: load_seq_cst_double: 492; LA64: # %bb.0: 493; LA64-NEXT: ld.d $a0, $a0, 0 494; LA64-NEXT: movgr2fr.d $fa0, $a0 495; LA64-NEXT: dbar 16 496; LA64-NEXT: ret 497 %val = load atomic double, ptr %ptr seq_cst, align 8 498 ret double %val 499} 500 501define void @store_release_i8(ptr %ptr, i8 signext %v) { 502; LA32-LABEL: store_release_i8: 503; LA32: # %bb.0: 504; LA32-NEXT: dbar 18 505; LA32-NEXT: st.b $a1, $a0, 0 506; LA32-NEXT: ret 507; 508; LA64-LABEL: store_release_i8: 509; LA64: # %bb.0: 510; LA64-NEXT: dbar 18 511; LA64-NEXT: st.b $a1, $a0, 0 512; LA64-NEXT: ret 513 store atomic i8 %v, ptr %ptr release, align 1 514 ret void 515} 516 517define void @store_release_i16(ptr %ptr, i16 signext %v) { 518; LA32-LABEL: store_release_i16: 519; LA32: # %bb.0: 520; LA32-NEXT: dbar 18 521; LA32-NEXT: st.h $a1, $a0, 0 522; LA32-NEXT: ret 523; 524; LA64-LABEL: store_release_i16: 525; LA64: # %bb.0: 526; LA64-NEXT: dbar 18 527; LA64-NEXT: st.h $a1, $a0, 0 528; LA64-NEXT: ret 529 store atomic i16 %v, ptr %ptr release, align 2 530 ret void 531} 532 533define void @store_release_i32(ptr %ptr, i32 signext %v) { 534; LA32-LABEL: store_release_i32: 535; LA32: # %bb.0: 536; LA32-NEXT: dbar 18 537; LA32-NEXT: st.w $a1, $a0, 0 538; LA32-NEXT: ret 539; 540; LA64-LABEL: store_release_i32: 541; LA64: # %bb.0: 542; LA64-NEXT: amswap_db.w $zero, $a1, $a0 543; LA64-NEXT: ret 544 store atomic i32 %v, ptr %ptr release, align 4 545 ret void 546} 547 548define void @store_release_i64(ptr %ptr, i64 %v) { 549; LA32-LABEL: store_release_i64: 550; LA32: # %bb.0: 551; LA32-NEXT: addi.w $sp, $sp, -16 552; LA32-NEXT: .cfi_def_cfa_offset 16 553; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 554; LA32-NEXT: .cfi_offset 1, -4 555; LA32-NEXT: ori $a3, $zero, 3 556; LA32-NEXT: bl %plt(__atomic_store_8) 557; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 558; LA32-NEXT: addi.w $sp, $sp, 16 559; LA32-NEXT: ret 560; 561; LA64-LABEL: store_release_i64: 562; LA64: # %bb.0: 563; LA64-NEXT: amswap_db.d $zero, $a1, $a0 564; LA64-NEXT: ret 565 store atomic i64 %v, ptr %ptr release, align 8 566 ret void 567} 568 569define void @store_release_ptr(ptr %ptr, ptr %v) { 570; LA32-LABEL: store_release_ptr: 571; LA32: # %bb.0: 572; LA32-NEXT: dbar 18 573; LA32-NEXT: st.w $a1, $a0, 0 574; LA32-NEXT: ret 575; 576; LA64-LABEL: store_release_ptr: 577; LA64: # %bb.0: 578; LA64-NEXT: amswap_db.d $zero, $a1, $a0 579; LA64-NEXT: ret 580 store atomic ptr %v, ptr %ptr release, align 8 581 ret void 582} 583 584define void @store_release_float(ptr %ptr, float %v) { 585; LA32-LABEL: store_release_float: 586; LA32: # %bb.0: 587; LA32-NEXT: movfr2gr.s $a1, $fa0 588; LA32-NEXT: dbar 18 589; LA32-NEXT: st.w $a1, $a0, 0 590; LA32-NEXT: ret 591; 592; LA64-LABEL: store_release_float: 593; LA64: # %bb.0: 594; LA64-NEXT: movfr2gr.s $a1, $fa0 595; LA64-NEXT: amswap_db.w $zero, $a1, $a0 596; LA64-NEXT: ret 597 store atomic float %v, ptr %ptr release, align 8 598 ret void 599} 600 601define void @store_release_double(ptr %ptr, double %v) { 602; LA32-LABEL: store_release_double: 603; LA32: # %bb.0: 604; LA32-NEXT: addi.w $sp, $sp, -16 605; LA32-NEXT: .cfi_def_cfa_offset 16 606; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 607; LA32-NEXT: .cfi_offset 1, -4 608; LA32-NEXT: fst.d $fa0, $sp, 0 609; LA32-NEXT: ld.w $a1, $sp, 0 610; LA32-NEXT: ld.w $a2, $sp, 4 611; LA32-NEXT: ori $a3, $zero, 3 612; LA32-NEXT: bl %plt(__atomic_store_8) 613; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 614; LA32-NEXT: addi.w $sp, $sp, 16 615; LA32-NEXT: ret 616; 617; LA64-LABEL: store_release_double: 618; LA64: # %bb.0: 619; LA64-NEXT: movfr2gr.d $a1, $fa0 620; LA64-NEXT: amswap_db.d $zero, $a1, $a0 621; LA64-NEXT: ret 622 store atomic double %v, ptr %ptr release, align 8 623 ret void 624} 625 626define void @store_unordered_i8(ptr %ptr, i8 signext %v) { 627; LA32-LABEL: store_unordered_i8: 628; LA32: # %bb.0: 629; LA32-NEXT: st.b $a1, $a0, 0 630; LA32-NEXT: ret 631; 632; LA64-LABEL: store_unordered_i8: 633; LA64: # %bb.0: 634; LA64-NEXT: st.b $a1, $a0, 0 635; LA64-NEXT: ret 636 store atomic i8 %v, ptr %ptr unordered, align 1 637 ret void 638} 639 640define void @store_unordered_i16(ptr %ptr, i16 signext %v) { 641; LA32-LABEL: store_unordered_i16: 642; LA32: # %bb.0: 643; LA32-NEXT: st.h $a1, $a0, 0 644; LA32-NEXT: ret 645; 646; LA64-LABEL: store_unordered_i16: 647; LA64: # %bb.0: 648; LA64-NEXT: st.h $a1, $a0, 0 649; LA64-NEXT: ret 650 store atomic i16 %v, ptr %ptr unordered, align 2 651 ret void 652} 653 654define void @store_unordered_i32(ptr %ptr, i32 signext %v) { 655; LA32-LABEL: store_unordered_i32: 656; LA32: # %bb.0: 657; LA32-NEXT: st.w $a1, $a0, 0 658; LA32-NEXT: ret 659; 660; LA64-LABEL: store_unordered_i32: 661; LA64: # %bb.0: 662; LA64-NEXT: st.w $a1, $a0, 0 663; LA64-NEXT: ret 664 store atomic i32 %v, ptr %ptr unordered, align 4 665 ret void 666} 667 668define void @store_unordered_i64(ptr %ptr, i64 %v) { 669; LA32-LABEL: store_unordered_i64: 670; LA32: # %bb.0: 671; LA32-NEXT: addi.w $sp, $sp, -16 672; LA32-NEXT: .cfi_def_cfa_offset 16 673; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 674; LA32-NEXT: .cfi_offset 1, -4 675; LA32-NEXT: move $a3, $zero 676; LA32-NEXT: bl %plt(__atomic_store_8) 677; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 678; LA32-NEXT: addi.w $sp, $sp, 16 679; LA32-NEXT: ret 680; 681; LA64-LABEL: store_unordered_i64: 682; LA64: # %bb.0: 683; LA64-NEXT: st.d $a1, $a0, 0 684; LA64-NEXT: ret 685 store atomic i64 %v, ptr %ptr unordered, align 8 686 ret void 687} 688 689define void @store_unordered_ptr(ptr %ptr, ptr %v) { 690; LA32-LABEL: store_unordered_ptr: 691; LA32: # %bb.0: 692; LA32-NEXT: st.w $a1, $a0, 0 693; LA32-NEXT: ret 694; 695; LA64-LABEL: store_unordered_ptr: 696; LA64: # %bb.0: 697; LA64-NEXT: st.d $a1, $a0, 0 698; LA64-NEXT: ret 699 store atomic ptr %v, ptr %ptr unordered, align 8 700 ret void 701} 702 703define void @store_unordered_float(ptr %ptr, float %v) { 704; LA32-LABEL: store_unordered_float: 705; LA32: # %bb.0: 706; LA32-NEXT: movfr2gr.s $a1, $fa0 707; LA32-NEXT: st.w $a1, $a0, 0 708; LA32-NEXT: ret 709; 710; LA64-LABEL: store_unordered_float: 711; LA64: # %bb.0: 712; LA64-NEXT: movfr2gr.s $a1, $fa0 713; LA64-NEXT: st.w $a1, $a0, 0 714; LA64-NEXT: ret 715 store atomic float %v, ptr %ptr unordered, align 8 716 ret void 717} 718 719define void @store_unordered_double(ptr %ptr, double %v) { 720; LA32-LABEL: store_unordered_double: 721; LA32: # %bb.0: 722; LA32-NEXT: addi.w $sp, $sp, -16 723; LA32-NEXT: .cfi_def_cfa_offset 16 724; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 725; LA32-NEXT: .cfi_offset 1, -4 726; LA32-NEXT: fst.d $fa0, $sp, 0 727; LA32-NEXT: ld.w $a1, $sp, 0 728; LA32-NEXT: ld.w $a2, $sp, 4 729; LA32-NEXT: move $a3, $zero 730; LA32-NEXT: bl %plt(__atomic_store_8) 731; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 732; LA32-NEXT: addi.w $sp, $sp, 16 733; LA32-NEXT: ret 734; 735; LA64-LABEL: store_unordered_double: 736; LA64: # %bb.0: 737; LA64-NEXT: movfr2gr.d $a1, $fa0 738; LA64-NEXT: st.d $a1, $a0, 0 739; LA64-NEXT: ret 740 store atomic double %v, ptr %ptr unordered, align 8 741 ret void 742} 743 744define void @store_monotonic_i8(ptr %ptr, i8 signext %v) { 745; LA32-LABEL: store_monotonic_i8: 746; LA32: # %bb.0: 747; LA32-NEXT: st.b $a1, $a0, 0 748; LA32-NEXT: ret 749; 750; LA64-LABEL: store_monotonic_i8: 751; LA64: # %bb.0: 752; LA64-NEXT: st.b $a1, $a0, 0 753; LA64-NEXT: ret 754 store atomic i8 %v, ptr %ptr monotonic, align 1 755 ret void 756} 757 758define void @store_monotonic_i16(ptr %ptr, i16 signext %v) { 759; LA32-LABEL: store_monotonic_i16: 760; LA32: # %bb.0: 761; LA32-NEXT: st.h $a1, $a0, 0 762; LA32-NEXT: ret 763; 764; LA64-LABEL: store_monotonic_i16: 765; LA64: # %bb.0: 766; LA64-NEXT: st.h $a1, $a0, 0 767; LA64-NEXT: ret 768 store atomic i16 %v, ptr %ptr monotonic, align 2 769 ret void 770} 771 772define void @store_monotonic_i32(ptr %ptr, i32 signext %v) { 773; LA32-LABEL: store_monotonic_i32: 774; LA32: # %bb.0: 775; LA32-NEXT: st.w $a1, $a0, 0 776; LA32-NEXT: ret 777; 778; LA64-LABEL: store_monotonic_i32: 779; LA64: # %bb.0: 780; LA64-NEXT: st.w $a1, $a0, 0 781; LA64-NEXT: ret 782 store atomic i32 %v, ptr %ptr monotonic, align 4 783 ret void 784} 785 786define void @store_monotonic_i64(ptr %ptr, i64 %v) { 787; LA32-LABEL: store_monotonic_i64: 788; LA32: # %bb.0: 789; LA32-NEXT: addi.w $sp, $sp, -16 790; LA32-NEXT: .cfi_def_cfa_offset 16 791; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 792; LA32-NEXT: .cfi_offset 1, -4 793; LA32-NEXT: move $a3, $zero 794; LA32-NEXT: bl %plt(__atomic_store_8) 795; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 796; LA32-NEXT: addi.w $sp, $sp, 16 797; LA32-NEXT: ret 798; 799; LA64-LABEL: store_monotonic_i64: 800; LA64: # %bb.0: 801; LA64-NEXT: st.d $a1, $a0, 0 802; LA64-NEXT: ret 803 store atomic i64 %v, ptr %ptr monotonic, align 8 804 ret void 805} 806 807define void @store_monotonic_ptr(ptr %ptr, ptr %v) { 808; LA32-LABEL: store_monotonic_ptr: 809; LA32: # %bb.0: 810; LA32-NEXT: st.w $a1, $a0, 0 811; LA32-NEXT: ret 812; 813; LA64-LABEL: store_monotonic_ptr: 814; LA64: # %bb.0: 815; LA64-NEXT: st.d $a1, $a0, 0 816; LA64-NEXT: ret 817 store atomic ptr %v, ptr %ptr monotonic, align 8 818 ret void 819} 820 821define void @store_monotonic_float(ptr %ptr, float %v) { 822; LA32-LABEL: store_monotonic_float: 823; LA32: # %bb.0: 824; LA32-NEXT: movfr2gr.s $a1, $fa0 825; LA32-NEXT: st.w $a1, $a0, 0 826; LA32-NEXT: ret 827; 828; LA64-LABEL: store_monotonic_float: 829; LA64: # %bb.0: 830; LA64-NEXT: movfr2gr.s $a1, $fa0 831; LA64-NEXT: st.w $a1, $a0, 0 832; LA64-NEXT: ret 833 store atomic float %v, ptr %ptr monotonic, align 8 834 ret void 835} 836 837define void @store_monotonic_double(ptr %ptr, double %v) { 838; LA32-LABEL: store_monotonic_double: 839; LA32: # %bb.0: 840; LA32-NEXT: addi.w $sp, $sp, -16 841; LA32-NEXT: .cfi_def_cfa_offset 16 842; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 843; LA32-NEXT: .cfi_offset 1, -4 844; LA32-NEXT: fst.d $fa0, $sp, 0 845; LA32-NEXT: ld.w $a1, $sp, 0 846; LA32-NEXT: ld.w $a2, $sp, 4 847; LA32-NEXT: move $a3, $zero 848; LA32-NEXT: bl %plt(__atomic_store_8) 849; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 850; LA32-NEXT: addi.w $sp, $sp, 16 851; LA32-NEXT: ret 852; 853; LA64-LABEL: store_monotonic_double: 854; LA64: # %bb.0: 855; LA64-NEXT: movfr2gr.d $a1, $fa0 856; LA64-NEXT: st.d $a1, $a0, 0 857; LA64-NEXT: ret 858 store atomic double %v, ptr %ptr monotonic, align 8 859 ret void 860} 861 862define void @store_seq_cst_i8(ptr %ptr, i8 signext %v) { 863; LA32-LABEL: store_seq_cst_i8: 864; LA32: # %bb.0: 865; LA32-NEXT: dbar 16 866; LA32-NEXT: st.b $a1, $a0, 0 867; LA32-NEXT: dbar 16 868; LA32-NEXT: ret 869; 870; LA64-LABEL: store_seq_cst_i8: 871; LA64: # %bb.0: 872; LA64-NEXT: dbar 16 873; LA64-NEXT: st.b $a1, $a0, 0 874; LA64-NEXT: dbar 16 875; LA64-NEXT: ret 876 store atomic i8 %v, ptr %ptr seq_cst, align 1 877 ret void 878} 879 880define void @store_seq_cst_i16(ptr %ptr, i16 signext %v) { 881; LA32-LABEL: store_seq_cst_i16: 882; LA32: # %bb.0: 883; LA32-NEXT: dbar 16 884; LA32-NEXT: st.h $a1, $a0, 0 885; LA32-NEXT: dbar 16 886; LA32-NEXT: ret 887; 888; LA64-LABEL: store_seq_cst_i16: 889; LA64: # %bb.0: 890; LA64-NEXT: dbar 16 891; LA64-NEXT: st.h $a1, $a0, 0 892; LA64-NEXT: dbar 16 893; LA64-NEXT: ret 894 store atomic i16 %v, ptr %ptr seq_cst, align 2 895 ret void 896} 897 898define void @store_seq_cst_i32(ptr %ptr, i32 signext %v) { 899; LA32-LABEL: store_seq_cst_i32: 900; LA32: # %bb.0: 901; LA32-NEXT: dbar 16 902; LA32-NEXT: st.w $a1, $a0, 0 903; LA32-NEXT: dbar 16 904; LA32-NEXT: ret 905; 906; LA64-LABEL: store_seq_cst_i32: 907; LA64: # %bb.0: 908; LA64-NEXT: amswap_db.w $zero, $a1, $a0 909; LA64-NEXT: ret 910 store atomic i32 %v, ptr %ptr seq_cst, align 4 911 ret void 912} 913 914define void @store_seq_cst_i64(ptr %ptr, i64 %v) { 915; LA32-LABEL: store_seq_cst_i64: 916; LA32: # %bb.0: 917; LA32-NEXT: addi.w $sp, $sp, -16 918; LA32-NEXT: .cfi_def_cfa_offset 16 919; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 920; LA32-NEXT: .cfi_offset 1, -4 921; LA32-NEXT: ori $a3, $zero, 5 922; LA32-NEXT: bl %plt(__atomic_store_8) 923; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 924; LA32-NEXT: addi.w $sp, $sp, 16 925; LA32-NEXT: ret 926; 927; LA64-LABEL: store_seq_cst_i64: 928; LA64: # %bb.0: 929; LA64-NEXT: amswap_db.d $zero, $a1, $a0 930; LA64-NEXT: ret 931 store atomic i64 %v, ptr %ptr seq_cst, align 8 932 ret void 933} 934 935define void @store_seq_cst_ptr(ptr %ptr, ptr %v) { 936; LA32-LABEL: store_seq_cst_ptr: 937; LA32: # %bb.0: 938; LA32-NEXT: dbar 16 939; LA32-NEXT: st.w $a1, $a0, 0 940; LA32-NEXT: dbar 16 941; LA32-NEXT: ret 942; 943; LA64-LABEL: store_seq_cst_ptr: 944; LA64: # %bb.0: 945; LA64-NEXT: amswap_db.d $zero, $a1, $a0 946; LA64-NEXT: ret 947 store atomic ptr %v, ptr %ptr seq_cst, align 8 948 ret void 949} 950 951define void @store_seq_cst_float(ptr %ptr, float %v) { 952; LA32-LABEL: store_seq_cst_float: 953; LA32: # %bb.0: 954; LA32-NEXT: movfr2gr.s $a1, $fa0 955; LA32-NEXT: dbar 16 956; LA32-NEXT: st.w $a1, $a0, 0 957; LA32-NEXT: dbar 16 958; LA32-NEXT: ret 959; 960; LA64-LABEL: store_seq_cst_float: 961; LA64: # %bb.0: 962; LA64-NEXT: movfr2gr.s $a1, $fa0 963; LA64-NEXT: amswap_db.w $zero, $a1, $a0 964; LA64-NEXT: ret 965 store atomic float %v, ptr %ptr seq_cst, align 8 966 ret void 967} 968 969define void @store_seq_cst_double(ptr %ptr, double %v) { 970; LA32-LABEL: store_seq_cst_double: 971; LA32: # %bb.0: 972; LA32-NEXT: addi.w $sp, $sp, -16 973; LA32-NEXT: .cfi_def_cfa_offset 16 974; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 975; LA32-NEXT: .cfi_offset 1, -4 976; LA32-NEXT: fst.d $fa0, $sp, 0 977; LA32-NEXT: ld.w $a1, $sp, 0 978; LA32-NEXT: ld.w $a2, $sp, 4 979; LA32-NEXT: ori $a3, $zero, 5 980; LA32-NEXT: bl %plt(__atomic_store_8) 981; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 982; LA32-NEXT: addi.w $sp, $sp, 16 983; LA32-NEXT: ret 984; 985; LA64-LABEL: store_seq_cst_double: 986; LA64: # %bb.0: 987; LA64-NEXT: movfr2gr.d $a1, $fa0 988; LA64-NEXT: amswap_db.d $zero, $a1, $a0 989; LA64-NEXT: ret 990 store atomic double %v, ptr %ptr seq_cst, align 8 991 ret void 992} 993