111 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA644 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, 204410; LA32-NEXT: ret11;12; LA64-LABEL: stptr_w_too_small_offset:13; LA64: # %bb.0:14; LA64-NEXT: st.w $a1, $a0, 204415; LA64-NEXT: ret16 %addr = getelementptr inbounds i32, ptr %p, i64 51117 store i32 %val, ptr %addr, align 418 ret void19}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, 204726; LA32-NEXT: st.w $a1, $a0, 127; LA32-NEXT: ret28;29; LA64-LABEL: stptr_w:30; LA64: # %bb.0:31; LA64-NEXT: stptr.w $a1, $a0, 204832; LA64-NEXT: ret33 %addr = getelementptr inbounds i32, ptr %p, i64 51234 store i32 %val, ptr %addr, align 435 ret void36}37 38;; Check that stptr.w is not emitted for out-of-range offsets.39define void @stptr_w_too_big_offset(ptr %p, i32 signext %val) nounwind {40; LA32-LABEL: stptr_w_too_big_offset:41; LA32: # %bb.0:42; LA32-NEXT: lu12i.w $a2, 843; LA32-NEXT: add.w $a0, $a0, $a244; LA32-NEXT: st.w $a1, $a0, 045; LA32-NEXT: ret46;47; LA64-LABEL: stptr_w_too_big_offset:48; LA64: # %bb.0:49; LA64-NEXT: lu12i.w $a2, 850; LA64-NEXT: stx.w $a1, $a0, $a251; LA64-NEXT: ret52 %addr = getelementptr inbounds i32, ptr %p, i64 819253 store i32 %val, ptr %addr, align 454 ret void55}56 57;; Check that stptr.d is not emitted for small offsets.58define void @stptr_d_too_small_offset(ptr %p, i64 %val) nounwind {59; LA32-LABEL: stptr_d_too_small_offset:60; LA32: # %bb.0:61; LA32-NEXT: st.w $a2, $a0, 204462; LA32-NEXT: st.w $a1, $a0, 204063; LA32-NEXT: ret64;65; LA64-LABEL: stptr_d_too_small_offset:66; LA64: # %bb.0:67; LA64-NEXT: st.d $a1, $a0, 204068; LA64-NEXT: ret69 %addr = getelementptr inbounds i64, ptr %p, i64 25570 store i64 %val, ptr %addr, align 871 ret void72}73 74;; Check that stptr.d is emitted for applicable offsets.75define void @stptr_d(ptr %p, i64 %val) nounwind {76; LA32-LABEL: stptr_d:77; LA32: # %bb.0:78; LA32-NEXT: addi.w $a0, $a0, 204779; LA32-NEXT: st.w $a2, $a0, 580; LA32-NEXT: st.w $a1, $a0, 181; LA32-NEXT: ret82;83; LA64-LABEL: stptr_d:84; LA64: # %bb.0:85; LA64-NEXT: stptr.d $a1, $a0, 204886; LA64-NEXT: ret87 %addr = getelementptr inbounds i64, ptr %p, i64 25688 store i64 %val, ptr %addr, align 889 ret void90}91 92;; Check that stptr.d is not emitted for out-of-range offsets.93define void @stptr_d_too_big_offset(ptr %p, i64 %val) nounwind {94; LA32-LABEL: stptr_d_too_big_offset:95; LA32: # %bb.0:96; LA32-NEXT: lu12i.w $a3, 897; LA32-NEXT: add.w $a0, $a0, $a398; LA32-NEXT: st.w $a2, $a0, 499; LA32-NEXT: st.w $a1, $a0, 0100; LA32-NEXT: ret101;102; LA64-LABEL: stptr_d_too_big_offset:103; LA64: # %bb.0:104; LA64-NEXT: lu12i.w $a2, 8105; LA64-NEXT: stx.d $a1, $a0, $a2106; LA64-NEXT: ret107 %addr = getelementptr inbounds i64, ptr %p, i64 4096108 store i64 %val, ptr %addr, align 8109 ret void110}111