1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64 4 5define i32 @ZC_offset_neg_32769(ptr %p) nounwind { 6; LA32-LABEL: ZC_offset_neg_32769: 7; LA32: # %bb.0: 8; LA32-NEXT: lu12i.w $a1, -9 9; LA32-NEXT: ori $a1, $a1, 4095 10; LA32-NEXT: add.w $a0, $a0, $a1 11; LA32-NEXT: #APP 12; LA32-NEXT: ll.w $a0, $a0, 0 13; LA32-NEXT: #NO_APP 14; LA32-NEXT: ret 15; 16; LA64-LABEL: ZC_offset_neg_32769: 17; LA64: # %bb.0: 18; LA64-NEXT: lu12i.w $a1, -9 19; LA64-NEXT: ori $a1, $a1, 4095 20; LA64-NEXT: add.d $a0, $a0, $a1 21; LA64-NEXT: #APP 22; LA64-NEXT: ll.w $a0, $a0, 0 23; LA64-NEXT: #NO_APP 24; LA64-NEXT: ret 25 %1 = getelementptr inbounds i8, ptr %p, i32 -32769 26 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 27 ret i32 %2 28} 29 30define i32 @ZC_offset_neg_32768(ptr %p) nounwind { 31; LA32-LABEL: ZC_offset_neg_32768: 32; LA32: # %bb.0: 33; LA32-NEXT: #APP 34; LA32-NEXT: ll.w $a0, $a0, -32768 35; LA32-NEXT: #NO_APP 36; LA32-NEXT: ret 37; 38; LA64-LABEL: ZC_offset_neg_32768: 39; LA64: # %bb.0: 40; LA64-NEXT: #APP 41; LA64-NEXT: ll.w $a0, $a0, -32768 42; LA64-NEXT: #NO_APP 43; LA64-NEXT: ret 44 %1 = getelementptr inbounds i8, ptr %p, i32 -32768 45 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 46 ret i32 %2 47} 48 49define i32 @ZC_offset_neg_4(ptr %p) nounwind { 50; LA32-LABEL: ZC_offset_neg_4: 51; LA32: # %bb.0: 52; LA32-NEXT: #APP 53; LA32-NEXT: ll.w $a0, $a0, -4 54; LA32-NEXT: #NO_APP 55; LA32-NEXT: ret 56; 57; LA64-LABEL: ZC_offset_neg_4: 58; LA64: # %bb.0: 59; LA64-NEXT: #APP 60; LA64-NEXT: ll.w $a0, $a0, -4 61; LA64-NEXT: #NO_APP 62; LA64-NEXT: ret 63 %1 = getelementptr inbounds i8, ptr %p, i32 -4 64 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 65 ret i32 %2 66} 67 68define i32 @ZC_offset_neg_1(ptr %p) nounwind { 69; LA32-LABEL: ZC_offset_neg_1: 70; LA32: # %bb.0: 71; LA32-NEXT: addi.w $a0, $a0, -1 72; LA32-NEXT: #APP 73; LA32-NEXT: ll.w $a0, $a0, 0 74; LA32-NEXT: #NO_APP 75; LA32-NEXT: ret 76; 77; LA64-LABEL: ZC_offset_neg_1: 78; LA64: # %bb.0: 79; LA64-NEXT: addi.d $a0, $a0, -1 80; LA64-NEXT: #APP 81; LA64-NEXT: ll.w $a0, $a0, 0 82; LA64-NEXT: #NO_APP 83; LA64-NEXT: ret 84 %1 = getelementptr inbounds i8, ptr %p, i32 -1 85 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 86 ret i32 %2 87} 88 89define i32 @ZC_offset_0(ptr %p) nounwind { 90; LA32-LABEL: ZC_offset_0: 91; LA32: # %bb.0: 92; LA32-NEXT: #APP 93; LA32-NEXT: ll.w $a0, $a0, 0 94; LA32-NEXT: #NO_APP 95; LA32-NEXT: ret 96; 97; LA64-LABEL: ZC_offset_0: 98; LA64: # %bb.0: 99; LA64-NEXT: #APP 100; LA64-NEXT: ll.w $a0, $a0, 0 101; LA64-NEXT: #NO_APP 102; LA64-NEXT: ret 103 %1 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %p) 104 ret i32 %1 105} 106 107define i32 @ZC_offset_1(ptr %p) nounwind { 108; LA32-LABEL: ZC_offset_1: 109; LA32: # %bb.0: 110; LA32-NEXT: addi.w $a0, $a0, 1 111; LA32-NEXT: #APP 112; LA32-NEXT: ll.w $a0, $a0, 0 113; LA32-NEXT: #NO_APP 114; LA32-NEXT: ret 115; 116; LA64-LABEL: ZC_offset_1: 117; LA64: # %bb.0: 118; LA64-NEXT: addi.d $a0, $a0, 1 119; LA64-NEXT: #APP 120; LA64-NEXT: ll.w $a0, $a0, 0 121; LA64-NEXT: #NO_APP 122; LA64-NEXT: ret 123 %1 = getelementptr inbounds i8, ptr %p, i32 1 124 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 125 ret i32 %2 126} 127 128define i32 @ZC_offset_32764(ptr %p) nounwind { 129; LA32-LABEL: ZC_offset_32764: 130; LA32: # %bb.0: 131; LA32-NEXT: #APP 132; LA32-NEXT: ll.w $a0, $a0, 32764 133; LA32-NEXT: #NO_APP 134; LA32-NEXT: ret 135; 136; LA64-LABEL: ZC_offset_32764: 137; LA64: # %bb.0: 138; LA64-NEXT: #APP 139; LA64-NEXT: ll.w $a0, $a0, 32764 140; LA64-NEXT: #NO_APP 141; LA64-NEXT: ret 142 %1 = getelementptr inbounds i8, ptr %p, i32 32764 143 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 144 ret i32 %2 145} 146 147define i32 @ZC_offset_32767(ptr %p) nounwind { 148; LA32-LABEL: ZC_offset_32767: 149; LA32: # %bb.0: 150; LA32-NEXT: lu12i.w $a1, 7 151; LA32-NEXT: ori $a1, $a1, 4095 152; LA32-NEXT: add.w $a0, $a0, $a1 153; LA32-NEXT: #APP 154; LA32-NEXT: ll.w $a0, $a0, 0 155; LA32-NEXT: #NO_APP 156; LA32-NEXT: ret 157; 158; LA64-LABEL: ZC_offset_32767: 159; LA64: # %bb.0: 160; LA64-NEXT: lu12i.w $a1, 7 161; LA64-NEXT: ori $a1, $a1, 4095 162; LA64-NEXT: add.d $a0, $a0, $a1 163; LA64-NEXT: #APP 164; LA64-NEXT: ll.w $a0, $a0, 0 165; LA64-NEXT: #NO_APP 166; LA64-NEXT: ret 167 %1 = getelementptr inbounds i8, ptr %p, i32 32767 168 %2 = call i32 asm "ll.w $0, $1", "=r,*^ZC"(ptr elementtype(i32) %1) 169 ret i32 %2 170} 171