1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 < %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 0 10; LA32-NEXT: jirl $zero, $ra, 0 11; 12; LA64-LABEL: load_acquire_i8: 13; LA64: # %bb.0: 14; LA64-NEXT: ld.b $a0, $a0, 0 15; LA64-NEXT: dbar 0 16; LA64-NEXT: jirl $zero, $ra, 0 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 0 26; LA32-NEXT: jirl $zero, $ra, 0 27; 28; LA64-LABEL: load_acquire_i16: 29; LA64: # %bb.0: 30; LA64-NEXT: ld.h $a0, $a0, 0 31; LA64-NEXT: dbar 0 32; LA64-NEXT: jirl $zero, $ra, 0 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 0 42; LA32-NEXT: jirl $zero, $ra, 0 43; 44; LA64-LABEL: load_acquire_i32: 45; LA64: # %bb.0: 46; LA64-NEXT: ld.w $a0, $a0, 0 47; LA64-NEXT: dbar 0 48; LA64-NEXT: jirl $zero, $ra, 0 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 __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: jirl $zero, $ra, 0 65; 66; LA64-LABEL: load_acquire_i64: 67; LA64: # %bb.0: 68; LA64-NEXT: ld.d $a0, $a0, 0 69; LA64-NEXT: dbar 0 70; LA64-NEXT: jirl $zero, $ra, 0 71 %val = load atomic i64, ptr %ptr acquire, align 8 72 ret i64 %val 73} 74 75define void @store_release_i8(ptr %ptr, i8 signext %v) { 76; LA32-LABEL: store_release_i8: 77; LA32: # %bb.0: 78; LA32-NEXT: dbar 0 79; LA32-NEXT: st.b $a0, $a1, 0 80; LA32-NEXT: jirl $zero, $ra, 0 81; 82; LA64-LABEL: store_release_i8: 83; LA64: # %bb.0: 84; LA64-NEXT: dbar 0 85; LA64-NEXT: st.b $a0, $a1, 0 86; LA64-NEXT: jirl $zero, $ra, 0 87 store atomic i8 %v, ptr %ptr release, align 1 88 ret void 89} 90 91define void @store_release_i16(ptr %ptr, i16 signext %v) { 92; LA32-LABEL: store_release_i16: 93; LA32: # %bb.0: 94; LA32-NEXT: dbar 0 95; LA32-NEXT: st.h $a0, $a1, 0 96; LA32-NEXT: jirl $zero, $ra, 0 97; 98; LA64-LABEL: store_release_i16: 99; LA64: # %bb.0: 100; LA64-NEXT: dbar 0 101; LA64-NEXT: st.h $a0, $a1, 0 102; LA64-NEXT: jirl $zero, $ra, 0 103 store atomic i16 %v, ptr %ptr release, align 2 104 ret void 105} 106 107define void @store_release_i32(ptr %ptr, i32 signext %v) { 108; LA32-LABEL: store_release_i32: 109; LA32: # %bb.0: 110; LA32-NEXT: dbar 0 111; LA32-NEXT: st.w $a0, $a1, 0 112; LA32-NEXT: jirl $zero, $ra, 0 113; 114; LA64-LABEL: store_release_i32: 115; LA64: # %bb.0: 116; LA64-NEXT: dbar 0 117; LA64-NEXT: st.w $a0, $a1, 0 118; LA64-NEXT: jirl $zero, $ra, 0 119 store atomic i32 %v, ptr %ptr release, align 4 120 ret void 121} 122 123define void @store_release_i64(ptr %ptr, i64 %v) { 124; LA32-LABEL: store_release_i64: 125; LA32: # %bb.0: 126; LA32-NEXT: addi.w $sp, $sp, -16 127; LA32-NEXT: .cfi_def_cfa_offset 16 128; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 129; LA32-NEXT: .cfi_offset 1, -4 130; LA32-NEXT: ori $a3, $zero, 3 131; LA32-NEXT: bl __atomic_store_8 132; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 133; LA32-NEXT: addi.w $sp, $sp, 16 134; LA32-NEXT: jirl $zero, $ra, 0 135; 136; LA64-LABEL: store_release_i64: 137; LA64: # %bb.0: 138; LA64-NEXT: dbar 0 139; LA64-NEXT: st.d $a0, $a1, 0 140; LA64-NEXT: jirl $zero, $ra, 0 141 store atomic i64 %v, ptr %ptr release, align 8 142 ret void 143} 144