254 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,+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA323; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA644 5define void @extract_32xi8(ptr %src, ptr %dst) nounwind {6; CHECK-LABEL: extract_32xi8:7; CHECK: # %bb.0:8; CHECK-NEXT: xvld $xr0, $a0, 09; CHECK-NEXT: xvstelm.b $xr0, $a1, 0, 110; CHECK-NEXT: ret11 %v = load volatile <32 x i8>, ptr %src12 %e = extractelement <32 x i8> %v, i32 113 store i8 %e, ptr %dst14 ret void15}16 17define void @extract_16xi16(ptr %src, ptr %dst) nounwind {18; CHECK-LABEL: extract_16xi16:19; CHECK: # %bb.0:20; CHECK-NEXT: xvld $xr0, $a0, 021; CHECK-NEXT: xvstelm.h $xr0, $a1, 0, 122; CHECK-NEXT: ret23 %v = load volatile <16 x i16>, ptr %src24 %e = extractelement <16 x i16> %v, i32 125 store i16 %e, ptr %dst26 ret void27}28 29define void @extract_8xi32(ptr %src, ptr %dst) nounwind {30; LA32-LABEL: extract_8xi32:31; LA32: # %bb.0:32; LA32-NEXT: xvld $xr0, $a0, 033; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 134; LA32-NEXT: st.w $a0, $a1, 035; LA32-NEXT: ret36;37; LA64-LABEL: extract_8xi32:38; LA64: # %bb.0:39; LA64-NEXT: xvld $xr0, $a0, 040; LA64-NEXT: xvstelm.w $xr0, $a1, 0, 141; LA64-NEXT: ret42 %v = load volatile <8 x i32>, ptr %src43 %e = extractelement <8 x i32> %v, i32 144 store i32 %e, ptr %dst45 ret void46}47 48define void @extract_4xi64(ptr %src, ptr %dst) nounwind {49; LA32-LABEL: extract_4xi64:50; LA32: # %bb.0:51; LA32-NEXT: xvld $xr0, $a0, 052; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 253; LA32-NEXT: xvpickve2gr.w $a2, $xr0, 354; LA32-NEXT: st.w $a2, $a1, 455; LA32-NEXT: st.w $a0, $a1, 056; LA32-NEXT: ret57;58; LA64-LABEL: extract_4xi64:59; LA64: # %bb.0:60; LA64-NEXT: xvld $xr0, $a0, 061; LA64-NEXT: xvstelm.d $xr0, $a1, 0, 162; LA64-NEXT: ret63 %v = load volatile <4 x i64>, ptr %src64 %e = extractelement <4 x i64> %v, i32 165 store i64 %e, ptr %dst66 ret void67}68 69define void @extract_8xfloat(ptr %src, ptr %dst) nounwind {70; CHECK-LABEL: extract_8xfloat:71; CHECK: # %bb.0:72; CHECK-NEXT: xvld $xr0, $a0, 073; CHECK-NEXT: xvstelm.w $xr0, $a1, 0, 774; CHECK-NEXT: ret75 %v = load volatile <8 x float>, ptr %src76 %e = extractelement <8 x float> %v, i32 777 store float %e, ptr %dst78 ret void79}80 81define void @extract_4xdouble(ptr %src, ptr %dst) nounwind {82; CHECK-LABEL: extract_4xdouble:83; CHECK: # %bb.0:84; CHECK-NEXT: xvld $xr0, $a0, 085; CHECK-NEXT: xvstelm.d $xr0, $a1, 0, 386; CHECK-NEXT: ret87 %v = load volatile <4 x double>, ptr %src88 %e = extractelement <4 x double> %v, i32 389 store double %e, ptr %dst90 ret void91}92 93define void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {94; LA32-LABEL: extract_32xi8_idx:95; LA32: # %bb.0:96; LA32-NEXT: xvld $xr0, $a0, 097; LA32-NEXT: movgr2fr.w $fa1, $a298; LA32-NEXT: xvpermi.q $xr2, $xr0, 199; LA32-NEXT: xvshuf.b $xr0, $xr2, $xr0, $xr1100; LA32-NEXT: xvstelm.b $xr0, $a1, 0, 0101; LA32-NEXT: ret102;103; LA64-LABEL: extract_32xi8_idx:104; LA64: # %bb.0:105; LA64-NEXT: xvld $xr0, $a0, 0106; LA64-NEXT: xvpermi.q $xr1, $xr0, 1107; LA64-NEXT: movgr2fr.w $fa2, $a2108; LA64-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2109; LA64-NEXT: xvstelm.b $xr0, $a1, 0, 0110; LA64-NEXT: ret111 %v = load volatile <32 x i8>, ptr %src112 %e = extractelement <32 x i8> %v, i32 %idx113 store i8 %e, ptr %dst114 ret void115}116 117define void @extract_16xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind {118; LA32-LABEL: extract_16xi16_idx:119; LA32: # %bb.0:120; LA32-NEXT: xvld $xr0, $a0, 0121; LA32-NEXT: movgr2fr.w $fa1, $a2122; LA32-NEXT: xvpermi.q $xr2, $xr0, 1123; LA32-NEXT: xvshuf.h $xr1, $xr2, $xr0124; LA32-NEXT: xvstelm.h $xr1, $a1, 0, 0125; LA32-NEXT: ret126;127; LA64-LABEL: extract_16xi16_idx:128; LA64: # %bb.0:129; LA64-NEXT: xvld $xr0, $a0, 0130; LA64-NEXT: xvpermi.q $xr1, $xr0, 1131; LA64-NEXT: movgr2fr.w $fa2, $a2132; LA64-NEXT: xvshuf.h $xr2, $xr1, $xr0133; LA64-NEXT: xvstelm.h $xr2, $a1, 0, 0134; LA64-NEXT: ret135 %v = load volatile <16 x i16>, ptr %src136 %e = extractelement <16 x i16> %v, i32 %idx137 store i16 %e, ptr %dst138 ret void139}140 141define void @extract_8xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {142; LA32-LABEL: extract_8xi32_idx:143; LA32: # %bb.0:144; LA32-NEXT: xvld $xr0, $a0, 0145; LA32-NEXT: xvreplgr2vr.w $xr1, $a2146; LA32-NEXT: xvperm.w $xr0, $xr0, $xr1147; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 0148; LA32-NEXT: st.w $a0, $a1, 0149; LA32-NEXT: ret150;151; LA64-LABEL: extract_8xi32_idx:152; LA64: # %bb.0:153; LA64-NEXT: xvld $xr0, $a0, 0154; LA64-NEXT: xvreplgr2vr.w $xr1, $a2155; LA64-NEXT: xvperm.w $xr0, $xr0, $xr1156; LA64-NEXT: xvstelm.w $xr0, $a1, 0, 0157; LA64-NEXT: ret158 %v = load volatile <8 x i32>, ptr %src159 %e = extractelement <8 x i32> %v, i32 %idx160 store i32 %e, ptr %dst161 ret void162}163 164define void @extract_4xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind {165; LA32-LABEL: extract_4xi64_idx:166; LA32: # %bb.0:167; LA32-NEXT: xvld $xr0, $a0, 0168; LA32-NEXT: add.w $a0, $a2, $a2169; LA32-NEXT: addi.w $a2, $a0, 1170; LA32-NEXT: xvreplgr2vr.w $xr1, $a2171; LA32-NEXT: xvperm.w $xr1, $xr0, $xr1172; LA32-NEXT: xvpickve2gr.w $a2, $xr1, 0173; LA32-NEXT: xvreplgr2vr.w $xr1, $a0174; LA32-NEXT: xvperm.w $xr0, $xr0, $xr1175; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 0176; LA32-NEXT: st.w $a0, $a1, 0177; LA32-NEXT: st.w $a2, $a1, 4178; LA32-NEXT: ret179;180; LA64-LABEL: extract_4xi64_idx:181; LA64: # %bb.0:182; LA64-NEXT: xvld $xr0, $a0, 0183; LA64-NEXT: xvpermi.q $xr1, $xr0, 1184; LA64-NEXT: movgr2fr.w $fa2, $a2185; LA64-NEXT: xvshuf.d $xr2, $xr1, $xr0186; LA64-NEXT: xvstelm.d $xr2, $a1, 0, 0187; LA64-NEXT: ret188 %v = load volatile <4 x i64>, ptr %src189 %e = extractelement <4 x i64> %v, i32 %idx190 store i64 %e, ptr %dst191 ret void192}193 194define void @extract_8xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {195; CHECK-LABEL: extract_8xfloat_idx:196; CHECK: # %bb.0:197; CHECK-NEXT: xvld $xr0, $a0, 0198; CHECK-NEXT: xvreplgr2vr.w $xr1, $a2199; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1200; CHECK-NEXT: xvstelm.w $xr0, $a1, 0, 0201; CHECK-NEXT: ret202 %v = load volatile <8 x float>, ptr %src203 %e = extractelement <8 x float> %v, i32 %idx204 store float %e, ptr %dst205 ret void206}207 208define void @extract_4xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {209; LA32-LABEL: extract_4xdouble_idx:210; LA32: # %bb.0:211; LA32-NEXT: xvld $xr0, $a0, 0212; LA32-NEXT: movgr2fr.w $fa1, $a2213; LA32-NEXT: xvpermi.q $xr2, $xr0, 1214; LA32-NEXT: xvshuf.d $xr1, $xr2, $xr0215; LA32-NEXT: xvstelm.d $xr1, $a1, 0, 0216; LA32-NEXT: ret217;218; LA64-LABEL: extract_4xdouble_idx:219; LA64: # %bb.0:220; LA64-NEXT: xvld $xr0, $a0, 0221; LA64-NEXT: xvpermi.q $xr1, $xr0, 1222; LA64-NEXT: movgr2fr.w $fa2, $a2223; LA64-NEXT: xvshuf.d $xr2, $xr1, $xr0224; LA64-NEXT: xvstelm.d $xr2, $a1, 0, 0225; LA64-NEXT: ret226 %v = load volatile <4 x double>, ptr %src227 %e = extractelement <4 x double> %v, i32 %idx228 store double %e, ptr %dst229 ret void230}231 232define void @eliminate_frame_index(<8 x i32> %a) nounwind {233; LA32-LABEL: eliminate_frame_index:234; LA32: # %bb.0:235; LA32-NEXT: addi.w $sp, $sp, -1040236; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 1237; LA32-NEXT: st.w $a0, $sp, 524238; LA32-NEXT: addi.w $sp, $sp, 1040239; LA32-NEXT: ret240;241; LA64-LABEL: eliminate_frame_index:242; LA64: # %bb.0:243; LA64-NEXT: addi.d $sp, $sp, -1040244; LA64-NEXT: addi.d $a0, $sp, 524245; LA64-NEXT: xvstelm.w $xr0, $a0, 0, 1246; LA64-NEXT: addi.d $sp, $sp, 1040247; LA64-NEXT: ret248 %1 = alloca [32 x [8 x i32]]249 %2 = getelementptr i8, ptr %1, i64 508250 %b = extractelement <8 x i32> %a, i64 1251 store i32 %b, ptr %2252 ret void253}254