brintos

brintos / llvm-project-archived public Read only

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