brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.6 KiB · 60b5175 Raw
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