12492bdb2Sgonglingqin; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 3*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 42492bdb2Sgonglingqin 52492bdb2Sgonglingqin;; Check that ldptr.w is not emitted for small offsets. 62492bdb2Sgonglingqindefine signext i32 @ldptr_w_too_small_offset(ptr %p) nounwind { 72492bdb2Sgonglingqin; LA32-LABEL: ldptr_w_too_small_offset: 82492bdb2Sgonglingqin; LA32: # %bb.0: # %entry 92492bdb2Sgonglingqin; LA32-NEXT: ld.w $a0, $a0, 2044 102492bdb2Sgonglingqin; LA32-NEXT: ret 112492bdb2Sgonglingqin; 122492bdb2Sgonglingqin; LA64-LABEL: ldptr_w_too_small_offset: 132492bdb2Sgonglingqin; LA64: # %bb.0: # %entry 142492bdb2Sgonglingqin; LA64-NEXT: ld.w $a0, $a0, 2044 152492bdb2Sgonglingqin; LA64-NEXT: ret 162492bdb2Sgonglingqinentry: 172492bdb2Sgonglingqin %addr = getelementptr inbounds i32, ptr %p, i64 511 182492bdb2Sgonglingqin %val = load i32, ptr %addr, align 4 192492bdb2Sgonglingqin ret i32 %val 202492bdb2Sgonglingqin} 212492bdb2Sgonglingqin 222492bdb2Sgonglingqin;; Check that ldptr.w is emitted for applicable offsets. 232492bdb2Sgonglingqindefine signext i32 @ldptr_w(ptr %p) nounwind { 242492bdb2Sgonglingqin; LA32-LABEL: ldptr_w: 252492bdb2Sgonglingqin; LA32: # %bb.0: # %entry 26ec37a35aSBen Shi; LA32-NEXT: addi.w $a0, $a0, 2047 27ec37a35aSBen Shi; LA32-NEXT: addi.w $a0, $a0, 1 282492bdb2Sgonglingqin; LA32-NEXT: ld.w $a0, $a0, 0 292492bdb2Sgonglingqin; LA32-NEXT: ret 302492bdb2Sgonglingqin; 312492bdb2Sgonglingqin; LA64-LABEL: ldptr_w: 322492bdb2Sgonglingqin; LA64: # %bb.0: # %entry 332492bdb2Sgonglingqin; LA64-NEXT: ldptr.w $a0, $a0, 2048 342492bdb2Sgonglingqin; LA64-NEXT: ret 352492bdb2Sgonglingqinentry: 362492bdb2Sgonglingqin %addr = getelementptr inbounds i32, ptr %p, i64 512 372492bdb2Sgonglingqin %val = load i32, ptr %addr, align 4 382492bdb2Sgonglingqin ret i32 %val 392492bdb2Sgonglingqin} 402492bdb2Sgonglingqin 412492bdb2Sgonglingqin;; Check that ldptr.w is not emitted for out-of-range offsets. 422492bdb2Sgonglingqindefine signext i32 @ldptr_w_too_big_offset(ptr %p) nounwind { 432492bdb2Sgonglingqin; LA32-LABEL: ldptr_w_too_big_offset: 442492bdb2Sgonglingqin; LA32: # %bb.0: # %entry 452492bdb2Sgonglingqin; LA32-NEXT: lu12i.w $a1, 8 462492bdb2Sgonglingqin; LA32-NEXT: add.w $a0, $a0, $a1 472492bdb2Sgonglingqin; LA32-NEXT: ld.w $a0, $a0, 0 482492bdb2Sgonglingqin; LA32-NEXT: ret 492492bdb2Sgonglingqin; 502492bdb2Sgonglingqin; LA64-LABEL: ldptr_w_too_big_offset: 512492bdb2Sgonglingqin; LA64: # %bb.0: # %entry 522492bdb2Sgonglingqin; LA64-NEXT: lu12i.w $a1, 8 532492bdb2Sgonglingqin; LA64-NEXT: ldx.w $a0, $a0, $a1 542492bdb2Sgonglingqin; LA64-NEXT: ret 552492bdb2Sgonglingqinentry: 562492bdb2Sgonglingqin %addr = getelementptr inbounds i32, ptr %p, i64 8192 572492bdb2Sgonglingqin %val = load i32, ptr %addr, align 4 582492bdb2Sgonglingqin ret i32 %val 592492bdb2Sgonglingqin} 602492bdb2Sgonglingqin 612492bdb2Sgonglingqin;; Check that ldptr.d is not emitted for small offsets. 622492bdb2Sgonglingqindefine i64 @ldptr_d_too_small_offset(ptr %p) nounwind { 632492bdb2Sgonglingqin; LA32-LABEL: ldptr_d_too_small_offset: 642492bdb2Sgonglingqin; LA32: # %bb.0: # %entry 652492bdb2Sgonglingqin; LA32-NEXT: ld.w $a2, $a0, 2040 662492bdb2Sgonglingqin; LA32-NEXT: ld.w $a1, $a0, 2044 672492bdb2Sgonglingqin; LA32-NEXT: move $a0, $a2 682492bdb2Sgonglingqin; LA32-NEXT: ret 692492bdb2Sgonglingqin; 702492bdb2Sgonglingqin; LA64-LABEL: ldptr_d_too_small_offset: 712492bdb2Sgonglingqin; LA64: # %bb.0: # %entry 722492bdb2Sgonglingqin; LA64-NEXT: ld.d $a0, $a0, 2040 732492bdb2Sgonglingqin; LA64-NEXT: ret 742492bdb2Sgonglingqinentry: 752492bdb2Sgonglingqin %addr = getelementptr inbounds i64, ptr %p, i64 255 762492bdb2Sgonglingqin %val = load i64, ptr %addr, align 8 772492bdb2Sgonglingqin ret i64 %val 782492bdb2Sgonglingqin} 792492bdb2Sgonglingqin 802492bdb2Sgonglingqin;; Check that ldptr.d is emitted for applicable offsets. 812492bdb2Sgonglingqindefine i64 @ldptr_d(ptr %p) nounwind { 822492bdb2Sgonglingqin; LA32-LABEL: ldptr_d: 832492bdb2Sgonglingqin; LA32: # %bb.0: # %entry 84ec37a35aSBen Shi; LA32-NEXT: addi.w $a0, $a0, 2047 85ec37a35aSBen Shi; LA32-NEXT: addi.w $a1, $a0, 1 86d6f1c85eSgonglingqin; LA32-NEXT: ld.w $a0, $a1, 0 87d6f1c85eSgonglingqin; LA32-NEXT: ld.w $a1, $a1, 4 882492bdb2Sgonglingqin; LA32-NEXT: ret 892492bdb2Sgonglingqin; 902492bdb2Sgonglingqin; LA64-LABEL: ldptr_d: 912492bdb2Sgonglingqin; LA64: # %bb.0: # %entry 922492bdb2Sgonglingqin; LA64-NEXT: ldptr.d $a0, $a0, 2048 932492bdb2Sgonglingqin; LA64-NEXT: ret 942492bdb2Sgonglingqinentry: 952492bdb2Sgonglingqin %addr = getelementptr inbounds i64, ptr %p, i64 256 962492bdb2Sgonglingqin %val = load i64, ptr %addr, align 8 972492bdb2Sgonglingqin ret i64 %val 982492bdb2Sgonglingqin} 992492bdb2Sgonglingqin 1002492bdb2Sgonglingqin;; Check that ldptr.d is not emitted for out-of-range offsets. 1012492bdb2Sgonglingqindefine i64 @ldptr_d_too_big_offset(ptr %p) nounwind { 1022492bdb2Sgonglingqin; LA32-LABEL: ldptr_d_too_big_offset: 1032492bdb2Sgonglingqin; LA32: # %bb.0: # %entry 1042492bdb2Sgonglingqin; LA32-NEXT: lu12i.w $a1, 8 105d6f1c85eSgonglingqin; LA32-NEXT: add.w $a1, $a0, $a1 106d6f1c85eSgonglingqin; LA32-NEXT: ld.w $a0, $a1, 0 107d6f1c85eSgonglingqin; LA32-NEXT: ld.w $a1, $a1, 4 1082492bdb2Sgonglingqin; LA32-NEXT: ret 1092492bdb2Sgonglingqin; 1102492bdb2Sgonglingqin; LA64-LABEL: ldptr_d_too_big_offset: 1112492bdb2Sgonglingqin; LA64: # %bb.0: # %entry 1122492bdb2Sgonglingqin; LA64-NEXT: lu12i.w $a1, 8 1132492bdb2Sgonglingqin; LA64-NEXT: ldx.d $a0, $a0, $a1 1142492bdb2Sgonglingqin; LA64-NEXT: ret 1152492bdb2Sgonglingqinentry: 1162492bdb2Sgonglingqin %addr = getelementptr inbounds i64, ptr %p, i64 4096 1172492bdb2Sgonglingqin %val = load i64, ptr %addr, align 8 1182492bdb2Sgonglingqin ret i64 %val 1192492bdb2Sgonglingqin} 120