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 5;; Check that stptr.w is not emitted for small offsets. 6define void @stptr_w_too_small_offset(ptr %p, i32 signext %val) nounwind { 7; LA32-LABEL: stptr_w_too_small_offset: 8; LA32: # %bb.0: 9; LA32-NEXT: st.w $a1, $a0, 2044 10; LA32-NEXT: ret 11; 12; LA64-LABEL: stptr_w_too_small_offset: 13; LA64: # %bb.0: 14; LA64-NEXT: st.w $a1, $a0, 2044 15; LA64-NEXT: ret 16 %addr = getelementptr inbounds i32, ptr %p, i64 511 17 store i32 %val, ptr %addr, align 4 18 ret void 19} 20 21;; Check that stptr.w is emitted for applicable offsets. 22define void @stptr_w(ptr %p, i32 signext %val) nounwind { 23; LA32-LABEL: stptr_w: 24; LA32: # %bb.0: 25; LA32-NEXT: addi.w $a0, $a0, 2047 26; LA32-NEXT: addi.w $a0, $a0, 1 27; LA32-NEXT: st.w $a1, $a0, 0 28; LA32-NEXT: ret 29; 30; LA64-LABEL: stptr_w: 31; LA64: # %bb.0: 32; LA64-NEXT: stptr.w $a1, $a0, 2048 33; LA64-NEXT: ret 34 %addr = getelementptr inbounds i32, ptr %p, i64 512 35 store i32 %val, ptr %addr, align 4 36 ret void 37} 38 39;; Check that stptr.w is not emitted for out-of-range offsets. 40define void @stptr_w_too_big_offset(ptr %p, i32 signext %val) nounwind { 41; LA32-LABEL: stptr_w_too_big_offset: 42; LA32: # %bb.0: 43; LA32-NEXT: lu12i.w $a2, 8 44; LA32-NEXT: add.w $a0, $a0, $a2 45; LA32-NEXT: st.w $a1, $a0, 0 46; LA32-NEXT: ret 47; 48; LA64-LABEL: stptr_w_too_big_offset: 49; LA64: # %bb.0: 50; LA64-NEXT: lu12i.w $a2, 8 51; LA64-NEXT: stx.w $a1, $a0, $a2 52; LA64-NEXT: ret 53 %addr = getelementptr inbounds i32, ptr %p, i64 8192 54 store i32 %val, ptr %addr, align 4 55 ret void 56} 57 58;; Check that stptr.d is not emitted for small offsets. 59define void @stptr_d_too_small_offset(ptr %p, i64 %val) nounwind { 60; LA32-LABEL: stptr_d_too_small_offset: 61; LA32: # %bb.0: 62; LA32-NEXT: st.w $a2, $a0, 2044 63; LA32-NEXT: st.w $a1, $a0, 2040 64; LA32-NEXT: ret 65; 66; LA64-LABEL: stptr_d_too_small_offset: 67; LA64: # %bb.0: 68; LA64-NEXT: st.d $a1, $a0, 2040 69; LA64-NEXT: ret 70 %addr = getelementptr inbounds i64, ptr %p, i64 255 71 store i64 %val, ptr %addr, align 8 72 ret void 73} 74 75;; Check that stptr.d is emitted for applicable offsets. 76define void @stptr_d(ptr %p, i64 %val) nounwind { 77; LA32-LABEL: stptr_d: 78; LA32: # %bb.0: 79; LA32-NEXT: addi.w $a0, $a0, 2047 80; LA32-NEXT: addi.w $a0, $a0, 1 81; LA32-NEXT: st.w $a2, $a0, 4 82; LA32-NEXT: st.w $a1, $a0, 0 83; LA32-NEXT: ret 84; 85; LA64-LABEL: stptr_d: 86; LA64: # %bb.0: 87; LA64-NEXT: stptr.d $a1, $a0, 2048 88; LA64-NEXT: ret 89 %addr = getelementptr inbounds i64, ptr %p, i64 256 90 store i64 %val, ptr %addr, align 8 91 ret void 92} 93 94;; Check that stptr.d is not emitted for out-of-range offsets. 95define void @stptr_d_too_big_offset(ptr %p, i64 %val) nounwind { 96; LA32-LABEL: stptr_d_too_big_offset: 97; LA32: # %bb.0: 98; LA32-NEXT: lu12i.w $a3, 8 99; LA32-NEXT: add.w $a0, $a0, $a3 100; LA32-NEXT: st.w $a2, $a0, 4 101; LA32-NEXT: st.w $a1, $a0, 0 102; LA32-NEXT: ret 103; 104; LA64-LABEL: stptr_d_too_big_offset: 105; LA64: # %bb.0: 106; LA64-NEXT: lu12i.w $a2, 8 107; LA64-NEXT: stx.d $a1, $a0, $a2 108; LA64-NEXT: ret 109 %addr = getelementptr inbounds i64, ptr %p, i64 4096 110 store i64 %val, ptr %addr, align 8 111 ret void 112} 113