246 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx %s -o - | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 --mattr=+lsx %s -o - | FileCheck %s --check-prefix=LA644 5define void @load_trunc_2i64_to_2i32(ptr %ptr, ptr %dst) nounwind {6; LA32-LABEL: load_trunc_2i64_to_2i32:7; LA32: # %bb.0:8; LA32-NEXT: vld $vr0, $a0, 09; LA32-NEXT: vpickve2gr.w $a0, $vr0, 210; LA32-NEXT: st.w $a0, $a1, 411; LA32-NEXT: vpickve2gr.w $a0, $vr0, 012; LA32-NEXT: st.w $a0, $a1, 013; LA32-NEXT: ret14;15; LA64-LABEL: load_trunc_2i64_to_2i32:16; LA64: # %bb.0:17; LA64-NEXT: vld $vr0, $a0, 018; LA64-NEXT: vshuf4i.w $vr0, $vr0, 819; LA64-NEXT: vstelm.d $vr0, $a1, 0, 020; LA64-NEXT: ret21 %a = load <2 x i64>, ptr %ptr22 %trunc = trunc <2 x i64> %a to <2 x i32>23 store <2 x i32> %trunc, ptr %dst24 ret void25}26 27define void @load_trunc_2i64_to_2i16(ptr %ptr, ptr %dst) nounwind {28; LA32-LABEL: load_trunc_2i64_to_2i16:29; LA32: # %bb.0:30; LA32-NEXT: vld $vr0, $a0, 031; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI1_0)32; LA32-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI1_0)33; LA32-NEXT: vshuf.h $vr1, $vr0, $vr034; LA32-NEXT: vpickve2gr.w $a0, $vr1, 035; LA32-NEXT: st.w $a0, $a1, 036; LA32-NEXT: ret37;38; LA64-LABEL: load_trunc_2i64_to_2i16:39; LA64: # %bb.0:40; LA64-NEXT: vld $vr0, $a0, 041; LA64-NEXT: pcalau12i $a0, %pc_hi20(.LCPI1_0)42; LA64-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI1_0)43; LA64-NEXT: vshuf.h $vr1, $vr0, $vr044; LA64-NEXT: vstelm.w $vr1, $a1, 0, 045; LA64-NEXT: ret46 %a = load <2 x i64>, ptr %ptr47 %trunc = trunc <2 x i64> %a to <2 x i16>48 store <2 x i16> %trunc, ptr %dst49 ret void50}51 52define void @load_trunc_2i64_to_2i8(ptr %ptr, ptr %dst) nounwind {53; LA32-LABEL: load_trunc_2i64_to_2i8:54; LA32: # %bb.0:55; LA32-NEXT: vld $vr0, $a0, 056; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI2_0)57; LA32-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI2_0)58; LA32-NEXT: vshuf.b $vr0, $vr0, $vr0, $vr159; LA32-NEXT: vstelm.h $vr0, $a1, 0, 060; LA32-NEXT: ret61;62; LA64-LABEL: load_trunc_2i64_to_2i8:63; LA64: # %bb.0:64; LA64-NEXT: vld $vr0, $a0, 065; LA64-NEXT: pcalau12i $a0, %pc_hi20(.LCPI2_0)66; LA64-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI2_0)67; LA64-NEXT: vshuf.b $vr0, $vr0, $vr0, $vr168; LA64-NEXT: vstelm.h $vr0, $a1, 0, 069; LA64-NEXT: ret70 %a = load <2 x i64>, ptr %ptr71 %trunc = trunc <2 x i64> %a to <2 x i8>72 store <2 x i8> %trunc, ptr %dst73 ret void74}75 76define void @load_trunc_4i32_to_4i16(ptr %ptr, ptr %dst) nounwind {77; LA32-LABEL: load_trunc_4i32_to_4i16:78; LA32: # %bb.0:79; LA32-NEXT: vld $vr0, $a0, 080; LA32-NEXT: vpickev.h $vr0, $vr0, $vr081; LA32-NEXT: vpickve2gr.w $a0, $vr0, 182; LA32-NEXT: st.w $a0, $a1, 483; LA32-NEXT: vpickve2gr.w $a0, $vr0, 084; LA32-NEXT: st.w $a0, $a1, 085; LA32-NEXT: ret86;87; LA64-LABEL: load_trunc_4i32_to_4i16:88; LA64: # %bb.0:89; LA64-NEXT: vld $vr0, $a0, 090; LA64-NEXT: vpickev.h $vr0, $vr0, $vr091; LA64-NEXT: vstelm.d $vr0, $a1, 0, 092; LA64-NEXT: ret93 %a = load <4 x i32>, ptr %ptr94 %trunc = trunc <4 x i32> %a to <4 x i16>95 store <4 x i16> %trunc, ptr %dst96 ret void97}98 99define void @load_trunc_4i32_to_4i8(ptr %ptr, ptr %dst) nounwind {100; LA32-LABEL: load_trunc_4i32_to_4i8:101; LA32: # %bb.0:102; LA32-NEXT: vld $vr0, $a0, 0103; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI4_0)104; LA32-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI4_0)105; LA32-NEXT: vshuf.b $vr0, $vr0, $vr0, $vr1106; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0107; LA32-NEXT: st.w $a0, $a1, 0108; LA32-NEXT: ret109;110; LA64-LABEL: load_trunc_4i32_to_4i8:111; LA64: # %bb.0:112; LA64-NEXT: vld $vr0, $a0, 0113; LA64-NEXT: pcalau12i $a0, %pc_hi20(.LCPI4_0)114; LA64-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI4_0)115; LA64-NEXT: vshuf.b $vr0, $vr0, $vr0, $vr1116; LA64-NEXT: vstelm.w $vr0, $a1, 0, 0117; LA64-NEXT: ret118 %a = load <4 x i32>, ptr %ptr119 %trunc = trunc <4 x i32> %a to <4 x i8>120 store <4 x i8> %trunc, ptr %dst121 ret void122}123 124define void @load_trunc_8i16_to_8i8(ptr %ptr, ptr %dst) nounwind {125; LA32-LABEL: load_trunc_8i16_to_8i8:126; LA32: # %bb.0:127; LA32-NEXT: vld $vr0, $a0, 0128; LA32-NEXT: vpickev.b $vr0, $vr0, $vr0129; LA32-NEXT: vpickve2gr.w $a0, $vr0, 1130; LA32-NEXT: st.w $a0, $a1, 4131; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0132; LA32-NEXT: st.w $a0, $a1, 0133; LA32-NEXT: ret134;135; LA64-LABEL: load_trunc_8i16_to_8i8:136; LA64: # %bb.0:137; LA64-NEXT: vld $vr0, $a0, 0138; LA64-NEXT: vpickev.b $vr0, $vr0, $vr0139; LA64-NEXT: vstelm.d $vr0, $a1, 0, 0140; LA64-NEXT: ret141 %a = load <8 x i16>, ptr %ptr142 %trunc = trunc <8 x i16> %a to <8 x i8>143 store <8 x i8> %trunc, ptr %dst144 ret void145}146 147define void @load_trunc_2i32_to_2i16(ptr %ptr, ptr %dst) nounwind {148; LA32-LABEL: load_trunc_2i32_to_2i16:149; LA32: # %bb.0:150; LA32-NEXT: ld.w $a2, $a0, 0151; LA32-NEXT: ld.w $a0, $a0, 4152; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0153; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1154; LA32-NEXT: vshuf4i.h $vr0, $vr0, 8155; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0156; LA32-NEXT: st.w $a0, $a1, 0157; LA32-NEXT: ret158;159; LA64-LABEL: load_trunc_2i32_to_2i16:160; LA64: # %bb.0:161; LA64-NEXT: ld.d $a0, $a0, 0162; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0163; LA64-NEXT: vshuf4i.h $vr0, $vr0, 8164; LA64-NEXT: vstelm.w $vr0, $a1, 0, 0165; LA64-NEXT: ret166 %a = load <2 x i32>, ptr %ptr167 %trunc = trunc <2 x i32> %a to <2 x i16>168 store <2 x i16> %trunc, ptr %dst169 ret void170}171 172define void @load_trunc_2i32_to_2i8(ptr %ptr, ptr %dst) nounwind {173; LA32-LABEL: load_trunc_2i32_to_2i8:174; LA32: # %bb.0:175; LA32-NEXT: ld.w $a2, $a0, 0176; LA32-NEXT: ld.w $a0, $a0, 4177; LA32-NEXT: pcalau12i $a3, %pc_hi20(.LCPI7_0)178; LA32-NEXT: vld $vr0, $a3, %pc_lo12(.LCPI7_0)179; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 0180; LA32-NEXT: vinsgr2vr.w $vr1, $a0, 1181; LA32-NEXT: vshuf.b $vr0, $vr0, $vr1, $vr0182; LA32-NEXT: vstelm.h $vr0, $a1, 0, 0183; LA32-NEXT: ret184;185; LA64-LABEL: load_trunc_2i32_to_2i8:186; LA64: # %bb.0:187; LA64-NEXT: ld.d $a0, $a0, 0188; LA64-NEXT: pcalau12i $a2, %pc_hi20(.LCPI7_0)189; LA64-NEXT: vld $vr0, $a2, %pc_lo12(.LCPI7_0)190; LA64-NEXT: vinsgr2vr.d $vr1, $a0, 0191; LA64-NEXT: vshuf.b $vr0, $vr0, $vr1, $vr0192; LA64-NEXT: vstelm.h $vr0, $a1, 0, 0193; LA64-NEXT: ret194 %a = load <2 x i32>, ptr %ptr195 %trunc = trunc <2 x i32> %a to <2 x i8>196 store <2 x i8> %trunc, ptr %dst197 ret void198}199 200define void @load_trunc_4i16_to_4i8(ptr %ptr, ptr %dst) nounwind {201; LA32-LABEL: load_trunc_4i16_to_4i8:202; LA32: # %bb.0:203; LA32-NEXT: ld.w $a2, $a0, 0204; LA32-NEXT: ld.w $a0, $a0, 4205; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0206; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1207; LA32-NEXT: vpickev.b $vr0, $vr0, $vr0208; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0209; LA32-NEXT: st.w $a0, $a1, 0210; LA32-NEXT: ret211;212; LA64-LABEL: load_trunc_4i16_to_4i8:213; LA64: # %bb.0:214; LA64-NEXT: ld.d $a0, $a0, 0215; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0216; LA64-NEXT: vpickev.b $vr0, $vr0, $vr0217; LA64-NEXT: vstelm.w $vr0, $a1, 0, 0218; LA64-NEXT: ret219 %a = load <4 x i16>, ptr %ptr220 %trunc = trunc <4 x i16> %a to <4 x i8>221 store <4 x i8> %trunc, ptr %dst222 ret void223}224 225define void @load_trunc_2i16_to_2i8(ptr %ptr, ptr %dst) nounwind {226; LA32-LABEL: load_trunc_2i16_to_2i8:227; LA32: # %bb.0:228; LA32-NEXT: ld.w $a0, $a0, 0229; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 0230; LA32-NEXT: vshuf4i.b $vr0, $vr0, 8231; LA32-NEXT: vstelm.h $vr0, $a1, 0, 0232; LA32-NEXT: ret233;234; LA64-LABEL: load_trunc_2i16_to_2i8:235; LA64: # %bb.0:236; LA64-NEXT: ld.w $a0, $a0, 0237; LA64-NEXT: vinsgr2vr.w $vr0, $a0, 0238; LA64-NEXT: vshuf4i.b $vr0, $vr0, 8239; LA64-NEXT: vstelm.h $vr0, $a1, 0, 0240; LA64-NEXT: ret241 %a = load <2 x i16>, ptr %ptr242 %trunc = trunc <2 x i16> %a to <2 x i8>243 store <2 x i8> %trunc, ptr %dst244 ret void245}246