258 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s | FileCheck %s --check-prefixes=CHECK,LA323; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefixes=CHECK,LA644 5define void @extract_16xi8(ptr %src, ptr %dst) nounwind {6; CHECK-LABEL: extract_16xi8:7; CHECK: # %bb.0:8; CHECK-NEXT: vld $vr0, $a0, 09; CHECK-NEXT: vstelm.b $vr0, $a1, 0, 110; CHECK-NEXT: ret11 %v = load volatile <16 x i8>, ptr %src12 %e = extractelement <16 x i8> %v, i32 113 store i8 %e, ptr %dst14 ret void15}16 17define void @extract_8xi16(ptr %src, ptr %dst) nounwind {18; CHECK-LABEL: extract_8xi16:19; CHECK: # %bb.0:20; CHECK-NEXT: vld $vr0, $a0, 021; CHECK-NEXT: vstelm.h $vr0, $a1, 0, 122; CHECK-NEXT: ret23 %v = load volatile <8 x i16>, ptr %src24 %e = extractelement <8 x i16> %v, i32 125 store i16 %e, ptr %dst26 ret void27}28 29define void @extract_4xi32(ptr %src, ptr %dst) nounwind {30; LA32-LABEL: extract_4xi32:31; LA32: # %bb.0:32; LA32-NEXT: vld $vr0, $a0, 033; LA32-NEXT: vpickve2gr.w $a0, $vr0, 134; LA32-NEXT: st.w $a0, $a1, 035; LA32-NEXT: ret36;37; LA64-LABEL: extract_4xi32:38; LA64: # %bb.0:39; LA64-NEXT: vld $vr0, $a0, 040; LA64-NEXT: vstelm.w $vr0, $a1, 0, 141; LA64-NEXT: ret42 %v = load volatile <4 x i32>, ptr %src43 %e = extractelement <4 x i32> %v, i32 144 store i32 %e, ptr %dst45 ret void46}47 48define void @extract_2xi64(ptr %src, ptr %dst) nounwind {49; LA32-LABEL: extract_2xi64:50; LA32: # %bb.0:51; LA32-NEXT: vld $vr0, $a0, 052; LA32-NEXT: vpickve2gr.w $a0, $vr0, 253; LA32-NEXT: vpickve2gr.w $a2, $vr0, 354; LA32-NEXT: st.w $a2, $a1, 455; LA32-NEXT: st.w $a0, $a1, 056; LA32-NEXT: ret57;58; LA64-LABEL: extract_2xi64:59; LA64: # %bb.0:60; LA64-NEXT: vld $vr0, $a0, 061; LA64-NEXT: vstelm.d $vr0, $a1, 0, 162; LA64-NEXT: ret63 %v = load volatile <2 x i64>, ptr %src64 %e = extractelement <2 x i64> %v, i32 165 store i64 %e, ptr %dst66 ret void67}68 69define void @extract_4xfloat(ptr %src, ptr %dst) nounwind {70; CHECK-LABEL: extract_4xfloat:71; CHECK: # %bb.0:72; CHECK-NEXT: vld $vr0, $a0, 073; CHECK-NEXT: vstelm.w $vr0, $a1, 0, 174; CHECK-NEXT: ret75 %v = load volatile <4 x float>, ptr %src76 %e = extractelement <4 x float> %v, i32 177 store float %e, ptr %dst78 ret void79}80 81define void @extract_2xdouble(ptr %src, ptr %dst) nounwind {82; CHECK-LABEL: extract_2xdouble:83; CHECK: # %bb.0:84; CHECK-NEXT: vld $vr0, $a0, 085; CHECK-NEXT: vstelm.d $vr0, $a1, 0, 186; CHECK-NEXT: ret87 %v = load volatile <2 x double>, ptr %src88 %e = extractelement <2 x double> %v, i32 189 store double %e, ptr %dst90 ret void91}92 93define void @extract_16xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {94; LA32-LABEL: extract_16xi8_idx:95; LA32: # %bb.0:96; LA32-NEXT: vld $vr0, $a0, 097; LA32-NEXT: vreplve.b $vr0, $vr0, $a298; LA32-NEXT: movfr2gr.s $a0, $fa099; LA32-NEXT: srai.w $a0, $a0, 24100; LA32-NEXT: st.b $a0, $a1, 0101; LA32-NEXT: ret102;103; LA64-LABEL: extract_16xi8_idx:104; LA64: # %bb.0:105; LA64-NEXT: vld $vr0, $a0, 0106; LA64-NEXT: bstrpick.d $a0, $a2, 31, 0107; LA64-NEXT: vreplve.b $vr0, $vr0, $a0108; LA64-NEXT: movfr2gr.s $a0, $fa0109; LA64-NEXT: srai.w $a0, $a0, 24110; LA64-NEXT: st.b $a0, $a1, 0111; LA64-NEXT: ret112 %v = load volatile <16 x i8>, ptr %src113 %e = extractelement <16 x i8> %v, i32 %idx114 store i8 %e, ptr %dst115 ret void116}117 118define void @extract_8xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind {119; LA32-LABEL: extract_8xi16_idx:120; LA32: # %bb.0:121; LA32-NEXT: vld $vr0, $a0, 0122; LA32-NEXT: vreplve.h $vr0, $vr0, $a2123; LA32-NEXT: movfr2gr.s $a0, $fa0124; LA32-NEXT: srai.w $a0, $a0, 16125; LA32-NEXT: st.h $a0, $a1, 0126; LA32-NEXT: ret127;128; LA64-LABEL: extract_8xi16_idx:129; LA64: # %bb.0:130; LA64-NEXT: vld $vr0, $a0, 0131; LA64-NEXT: bstrpick.d $a0, $a2, 31, 0132; LA64-NEXT: vreplve.h $vr0, $vr0, $a0133; LA64-NEXT: movfr2gr.s $a0, $fa0134; LA64-NEXT: srai.w $a0, $a0, 16135; LA64-NEXT: st.h $a0, $a1, 0136; LA64-NEXT: ret137 %v = load volatile <8 x i16>, ptr %src138 %e = extractelement <8 x i16> %v, i32 %idx139 store i16 %e, ptr %dst140 ret void141}142 143define void @extract_4xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {144; LA32-LABEL: extract_4xi32_idx:145; LA32: # %bb.0:146; LA32-NEXT: vld $vr0, $a0, 0147; LA32-NEXT: vreplve.w $vr0, $vr0, $a2148; LA32-NEXT: movfr2gr.s $a0, $fa0149; LA32-NEXT: st.w $a0, $a1, 0150; LA32-NEXT: ret151;152; LA64-LABEL: extract_4xi32_idx:153; LA64: # %bb.0:154; LA64-NEXT: vld $vr0, $a0, 0155; LA64-NEXT: bstrpick.d $a0, $a2, 31, 0156; LA64-NEXT: vreplve.w $vr0, $vr0, $a0157; LA64-NEXT: movfr2gr.s $a0, $fa0158; LA64-NEXT: st.w $a0, $a1, 0159; LA64-NEXT: ret160 %v = load volatile <4 x i32>, ptr %src161 %e = extractelement <4 x i32> %v, i32 %idx162 store i32 %e, ptr %dst163 ret void164}165 166define void @extract_2xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind {167; LA32-LABEL: extract_2xi64_idx:168; LA32: # %bb.0:169; LA32-NEXT: vld $vr0, $a0, 0170; LA32-NEXT: add.w $a0, $a2, $a2171; LA32-NEXT: addi.w $a2, $a0, 1172; LA32-NEXT: vreplve.w $vr1, $vr0, $a2173; LA32-NEXT: vreplve.w $vr0, $vr0, $a0174; LA32-NEXT: movfr2gr.s $a0, $fa1175; LA32-NEXT: movfr2gr.s $a2, $fa0176; LA32-NEXT: st.w $a2, $a1, 0177; LA32-NEXT: st.w $a0, $a1, 4178; LA32-NEXT: ret179;180; LA64-LABEL: extract_2xi64_idx:181; LA64: # %bb.0:182; LA64-NEXT: vld $vr0, $a0, 0183; LA64-NEXT: bstrpick.d $a0, $a2, 31, 0184; LA64-NEXT: vreplve.d $vr0, $vr0, $a0185; LA64-NEXT: movfr2gr.d $a0, $fa0186; LA64-NEXT: st.d $a0, $a1, 0187; LA64-NEXT: ret188 %v = load volatile <2 x i64>, ptr %src189 %e = extractelement <2 x i64> %v, i32 %idx190 store i64 %e, ptr %dst191 ret void192}193 194define void @extract_4xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {195; LA32-LABEL: extract_4xfloat_idx:196; LA32: # %bb.0:197; LA32-NEXT: vld $vr0, $a0, 0198; LA32-NEXT: vreplve.w $vr0, $vr0, $a2199; LA32-NEXT: fst.s $fa0, $a1, 0200; LA32-NEXT: ret201;202; LA64-LABEL: extract_4xfloat_idx:203; LA64: # %bb.0:204; LA64-NEXT: vld $vr0, $a0, 0205; LA64-NEXT: bstrpick.d $a0, $a2, 31, 0206; LA64-NEXT: vreplve.w $vr0, $vr0, $a0207; LA64-NEXT: fst.s $fa0, $a1, 0208; LA64-NEXT: ret209 %v = load volatile <4 x float>, ptr %src210 %e = extractelement <4 x float> %v, i32 %idx211 store float %e, ptr %dst212 ret void213}214 215define void @extract_2xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {216; LA32-LABEL: extract_2xdouble_idx:217; LA32: # %bb.0:218; LA32-NEXT: vld $vr0, $a0, 0219; LA32-NEXT: vreplve.d $vr0, $vr0, $a2220; LA32-NEXT: fst.d $fa0, $a1, 0221; LA32-NEXT: ret222;223; LA64-LABEL: extract_2xdouble_idx:224; LA64: # %bb.0:225; LA64-NEXT: vld $vr0, $a0, 0226; LA64-NEXT: bstrpick.d $a0, $a2, 31, 0227; LA64-NEXT: vreplve.d $vr0, $vr0, $a0228; LA64-NEXT: fst.d $fa0, $a1, 0229; LA64-NEXT: ret230 %v = load volatile <2 x double>, ptr %src231 %e = extractelement <2 x double> %v, i32 %idx232 store double %e, ptr %dst233 ret void234}235 236define void @eliminate_frame_index(<4 x i32> %a) nounwind {237; LA32-LABEL: eliminate_frame_index:238; LA32: # %bb.0:239; LA32-NEXT: addi.w $sp, $sp, -1040240; LA32-NEXT: vpickve2gr.w $a0, $vr0, 1241; LA32-NEXT: st.w $a0, $sp, 524242; LA32-NEXT: addi.w $sp, $sp, 1040243; LA32-NEXT: ret244;245; LA64-LABEL: eliminate_frame_index:246; LA64: # %bb.0:247; LA64-NEXT: addi.d $sp, $sp, -1040248; LA64-NEXT: addi.d $a0, $sp, 524249; LA64-NEXT: vstelm.w $vr0, $a0, 0, 1250; LA64-NEXT: addi.d $sp, $sp, 1040251; LA64-NEXT: ret252 %1 = alloca [64 x [4 x i32]]253 %2 = getelementptr i8, ptr %1, i64 508254 %b = extractelement <4 x i32> %a, i64 1255 store i32 %b, ptr %2256 ret void257}258