118 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 ldptr.w is not emitted for small offsets.6define signext i32 @ldptr_w_too_small_offset(ptr %p) nounwind {7; LA32-LABEL: ldptr_w_too_small_offset:8; LA32: # %bb.0: # %entry9; LA32-NEXT: ld.w $a0, $a0, 204410; LA32-NEXT: ret11;12; LA64-LABEL: ldptr_w_too_small_offset:13; LA64: # %bb.0: # %entry14; LA64-NEXT: ld.w $a0, $a0, 204415; LA64-NEXT: ret16entry:17 %addr = getelementptr inbounds i32, ptr %p, i64 51118 %val = load i32, ptr %addr, align 419 ret i32 %val20}21 22;; Check that ldptr.w is emitted for applicable offsets.23define signext i32 @ldptr_w(ptr %p) nounwind {24; LA32-LABEL: ldptr_w:25; LA32: # %bb.0: # %entry26; LA32-NEXT: addi.w $a0, $a0, 204727; LA32-NEXT: ld.w $a0, $a0, 128; LA32-NEXT: ret29;30; LA64-LABEL: ldptr_w:31; LA64: # %bb.0: # %entry32; LA64-NEXT: ldptr.w $a0, $a0, 204833; LA64-NEXT: ret34entry:35 %addr = getelementptr inbounds i32, ptr %p, i64 51236 %val = load i32, ptr %addr, align 437 ret i32 %val38}39 40;; Check that ldptr.w is not emitted for out-of-range offsets.41define signext i32 @ldptr_w_too_big_offset(ptr %p) nounwind {42; LA32-LABEL: ldptr_w_too_big_offset:43; LA32: # %bb.0: # %entry44; LA32-NEXT: lu12i.w $a1, 845; LA32-NEXT: add.w $a0, $a0, $a146; LA32-NEXT: ld.w $a0, $a0, 047; LA32-NEXT: ret48;49; LA64-LABEL: ldptr_w_too_big_offset:50; LA64: # %bb.0: # %entry51; LA64-NEXT: lu12i.w $a1, 852; LA64-NEXT: ldx.w $a0, $a0, $a153; LA64-NEXT: ret54entry:55 %addr = getelementptr inbounds i32, ptr %p, i64 819256 %val = load i32, ptr %addr, align 457 ret i32 %val58}59 60;; Check that ldptr.d is not emitted for small offsets.61define i64 @ldptr_d_too_small_offset(ptr %p) nounwind {62; LA32-LABEL: ldptr_d_too_small_offset:63; LA32: # %bb.0: # %entry64; LA32-NEXT: ld.w $a2, $a0, 204065; LA32-NEXT: ld.w $a1, $a0, 204466; LA32-NEXT: move $a0, $a267; LA32-NEXT: ret68;69; LA64-LABEL: ldptr_d_too_small_offset:70; LA64: # %bb.0: # %entry71; LA64-NEXT: ld.d $a0, $a0, 204072; LA64-NEXT: ret73entry:74 %addr = getelementptr inbounds i64, ptr %p, i64 25575 %val = load i64, ptr %addr, align 876 ret i64 %val77}78 79;; Check that ldptr.d is emitted for applicable offsets.80define i64 @ldptr_d(ptr %p) nounwind {81; LA32-LABEL: ldptr_d:82; LA32: # %bb.0: # %entry83; LA32-NEXT: addi.w $a1, $a0, 204784; LA32-NEXT: ld.w $a0, $a1, 185; LA32-NEXT: ld.w $a1, $a1, 586; LA32-NEXT: ret87;88; LA64-LABEL: ldptr_d:89; LA64: # %bb.0: # %entry90; LA64-NEXT: ldptr.d $a0, $a0, 204891; LA64-NEXT: ret92entry:93 %addr = getelementptr inbounds i64, ptr %p, i64 25694 %val = load i64, ptr %addr, align 895 ret i64 %val96}97 98;; Check that ldptr.d is not emitted for out-of-range offsets.99define i64 @ldptr_d_too_big_offset(ptr %p) nounwind {100; LA32-LABEL: ldptr_d_too_big_offset:101; LA32: # %bb.0: # %entry102; LA32-NEXT: lu12i.w $a1, 8103; LA32-NEXT: add.w $a1, $a0, $a1104; LA32-NEXT: ld.w $a0, $a1, 0105; LA32-NEXT: ld.w $a1, $a1, 4106; LA32-NEXT: ret107;108; LA64-LABEL: ldptr_d_too_big_offset:109; LA64: # %bb.0: # %entry110; LA64-NEXT: lu12i.w $a1, 8111; LA64-NEXT: ldx.d $a0, $a0, $a1112; LA64-NEXT: ret113entry:114 %addr = getelementptr inbounds i64, ptr %p, i64 4096115 %val = load i64, ptr %addr, align 8116 ret i64 %val117}118