245 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-prefixes=CHECK,LA323; RUN: llc --mtriple=loongarch64 --mattr=+lsx %s -o - | FileCheck %s --check-prefixes=CHECK,LA644 5define void @vec_reduce_umin_v16i8(ptr %src, ptr %dst) nounwind {6; CHECK-LABEL: vec_reduce_umin_v16i8:7; CHECK: # %bb.0:8; CHECK-NEXT: vld $vr0, $a0, 09; CHECK-NEXT: vbsrl.v $vr1, $vr0, 810; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr011; CHECK-NEXT: vbsrl.v $vr1, $vr0, 412; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr013; CHECK-NEXT: vbsrl.v $vr1, $vr0, 214; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr015; CHECK-NEXT: vbsrl.v $vr1, $vr0, 116; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr017; CHECK-NEXT: vstelm.b $vr0, $a1, 0, 018; CHECK-NEXT: ret19 %v = load <16 x i8>, ptr %src20 %res = call i8 @llvm.vector.reduce.umin.v16i8(<16 x i8> %v)21 store i8 %res, ptr %dst22 ret void23}24 25define void @vec_reduce_umin_v8i8(ptr %src, ptr %dst) nounwind {26; LA32-LABEL: vec_reduce_umin_v8i8:27; LA32: # %bb.0:28; LA32-NEXT: ld.w $a2, $a0, 029; LA32-NEXT: ld.w $a0, $a0, 430; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 031; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 132; LA32-NEXT: vbsrl.v $vr1, $vr0, 433; LA32-NEXT: vmin.bu $vr0, $vr1, $vr034; LA32-NEXT: vbsrl.v $vr1, $vr0, 235; LA32-NEXT: vmin.bu $vr0, $vr1, $vr036; LA32-NEXT: vbsrl.v $vr1, $vr0, 137; LA32-NEXT: vmin.bu $vr0, $vr1, $vr038; LA32-NEXT: vstelm.b $vr0, $a1, 0, 039; LA32-NEXT: ret40;41; LA64-LABEL: vec_reduce_umin_v8i8:42; LA64: # %bb.0:43; LA64-NEXT: ld.d $a0, $a0, 044; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 045; LA64-NEXT: vbsrl.v $vr1, $vr0, 446; LA64-NEXT: vmin.bu $vr0, $vr1, $vr047; LA64-NEXT: vbsrl.v $vr1, $vr0, 248; LA64-NEXT: vmin.bu $vr0, $vr1, $vr049; LA64-NEXT: vbsrl.v $vr1, $vr0, 150; LA64-NEXT: vmin.bu $vr0, $vr1, $vr051; LA64-NEXT: vstelm.b $vr0, $a1, 0, 052; LA64-NEXT: ret53 %v = load <8 x i8>, ptr %src54 %res = call i8 @llvm.vector.reduce.umin.v8i8(<8 x i8> %v)55 store i8 %res, ptr %dst56 ret void57}58 59define void @vec_reduce_umin_v4i8(ptr %src, ptr %dst) nounwind {60; CHECK-LABEL: vec_reduce_umin_v4i8:61; CHECK: # %bb.0:62; CHECK-NEXT: ld.w $a0, $a0, 063; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 064; CHECK-NEXT: vbsrl.v $vr1, $vr0, 265; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr066; CHECK-NEXT: vbsrl.v $vr1, $vr0, 167; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr068; CHECK-NEXT: vstelm.b $vr0, $a1, 0, 069; CHECK-NEXT: ret70 %v = load <4 x i8>, ptr %src71 %res = call i8 @llvm.vector.reduce.umin.v4i8(<4 x i8> %v)72 store i8 %res, ptr %dst73 ret void74}75 76define void @vec_reduce_umin_v2i8(ptr %src, ptr %dst) nounwind {77; CHECK-LABEL: vec_reduce_umin_v2i8:78; CHECK: # %bb.0:79; CHECK-NEXT: ld.h $a0, $a0, 080; CHECK-NEXT: vinsgr2vr.h $vr0, $a0, 081; CHECK-NEXT: vbsrl.v $vr1, $vr0, 182; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr083; CHECK-NEXT: vstelm.b $vr0, $a1, 0, 084; CHECK-NEXT: ret85 %v = load <2 x i8>, ptr %src86 %res = call i8 @llvm.vector.reduce.umin.v2i8(<2 x i8> %v)87 store i8 %res, ptr %dst88 ret void89}90 91define void @vec_reduce_umin_v8i16(ptr %src, ptr %dst) nounwind {92; CHECK-LABEL: vec_reduce_umin_v8i16:93; CHECK: # %bb.0:94; CHECK-NEXT: vld $vr0, $a0, 095; CHECK-NEXT: vbsrl.v $vr1, $vr0, 896; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr097; CHECK-NEXT: vbsrl.v $vr1, $vr0, 498; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr099; CHECK-NEXT: vbsrl.v $vr1, $vr0, 2100; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr0101; CHECK-NEXT: vstelm.h $vr0, $a1, 0, 0102; CHECK-NEXT: ret103 %v = load <8 x i16>, ptr %src104 %res = call i16 @llvm.vector.reduce.umin.v8i16(<8 x i16> %v)105 store i16 %res, ptr %dst106 ret void107}108 109define void @vec_reduce_umin_v4i16(ptr %src, ptr %dst) nounwind {110; LA32-LABEL: vec_reduce_umin_v4i16:111; LA32: # %bb.0:112; LA32-NEXT: ld.w $a2, $a0, 0113; LA32-NEXT: ld.w $a0, $a0, 4114; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0115; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1116; LA32-NEXT: vbsrl.v $vr1, $vr0, 4117; LA32-NEXT: vmin.hu $vr0, $vr1, $vr0118; LA32-NEXT: vbsrl.v $vr1, $vr0, 2119; LA32-NEXT: vmin.hu $vr0, $vr1, $vr0120; LA32-NEXT: vstelm.h $vr0, $a1, 0, 0121; LA32-NEXT: ret122;123; LA64-LABEL: vec_reduce_umin_v4i16:124; LA64: # %bb.0:125; LA64-NEXT: ld.d $a0, $a0, 0126; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0127; LA64-NEXT: vbsrl.v $vr1, $vr0, 4128; LA64-NEXT: vmin.hu $vr0, $vr1, $vr0129; LA64-NEXT: vbsrl.v $vr1, $vr0, 2130; LA64-NEXT: vmin.hu $vr0, $vr1, $vr0131; LA64-NEXT: vstelm.h $vr0, $a1, 0, 0132; LA64-NEXT: ret133 %v = load <4 x i16>, ptr %src134 %res = call i16 @llvm.vector.reduce.umin.v4i16(<4 x i16> %v)135 store i16 %res, ptr %dst136 ret void137}138 139define void @vec_reduce_umin_v2i16(ptr %src, ptr %dst) nounwind {140; CHECK-LABEL: vec_reduce_umin_v2i16:141; CHECK: # %bb.0:142; CHECK-NEXT: ld.w $a0, $a0, 0143; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 0144; CHECK-NEXT: vbsrl.v $vr1, $vr0, 2145; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr0146; CHECK-NEXT: vstelm.h $vr0, $a1, 0, 0147; CHECK-NEXT: ret148 %v = load <2 x i16>, ptr %src149 %res = call i16 @llvm.vector.reduce.umin.v2i16(<2 x i16> %v)150 store i16 %res, ptr %dst151 ret void152}153 154define void @vec_reduce_umin_v4i32(ptr %src, ptr %dst) nounwind {155; LA32-LABEL: vec_reduce_umin_v4i32:156; LA32: # %bb.0:157; LA32-NEXT: vld $vr0, $a0, 0158; LA32-NEXT: vbsrl.v $vr1, $vr0, 8159; LA32-NEXT: vmin.wu $vr0, $vr1, $vr0160; LA32-NEXT: vbsrl.v $vr1, $vr0, 4161; LA32-NEXT: vmin.wu $vr0, $vr1, $vr0162; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0163; LA32-NEXT: st.w $a0, $a1, 0164; LA32-NEXT: ret165;166; LA64-LABEL: vec_reduce_umin_v4i32:167; LA64: # %bb.0:168; LA64-NEXT: vld $vr0, $a0, 0169; LA64-NEXT: vbsrl.v $vr1, $vr0, 8170; LA64-NEXT: vmin.wu $vr0, $vr1, $vr0171; LA64-NEXT: vbsrl.v $vr1, $vr0, 4172; LA64-NEXT: vmin.wu $vr0, $vr1, $vr0173; LA64-NEXT: vstelm.w $vr0, $a1, 0, 0174; LA64-NEXT: ret175 %v = load <4 x i32>, ptr %src176 %res = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %v)177 store i32 %res, ptr %dst178 ret void179}180 181define void @vec_reduce_umin_v2i32(ptr %src, ptr %dst) nounwind {182; LA32-LABEL: vec_reduce_umin_v2i32:183; LA32: # %bb.0:184; LA32-NEXT: ld.w $a2, $a0, 0185; LA32-NEXT: ld.w $a0, $a0, 4186; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0187; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1188; LA32-NEXT: vbsrl.v $vr1, $vr0, 4189; LA32-NEXT: vmin.wu $vr0, $vr1, $vr0190; LA32-NEXT: vpickve2gr.w $a0, $vr0, 0191; LA32-NEXT: st.w $a0, $a1, 0192; LA32-NEXT: ret193;194; LA64-LABEL: vec_reduce_umin_v2i32:195; LA64: # %bb.0:196; LA64-NEXT: ld.d $a0, $a0, 0197; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0198; LA64-NEXT: vbsrl.v $vr1, $vr0, 4199; LA64-NEXT: vmin.wu $vr0, $vr1, $vr0200; LA64-NEXT: vstelm.w $vr0, $a1, 0, 0201; LA64-NEXT: ret202 %v = load <2 x i32>, ptr %src203 %res = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %v)204 store i32 %res, ptr %dst205 ret void206}207 208define void @vec_reduce_umin_v2i64(ptr %src, ptr %dst) nounwind {209; LA32-LABEL: vec_reduce_umin_v2i64:210; LA32: # %bb.0:211; LA32-NEXT: vld $vr0, $a0, 0212; LA32-NEXT: vpickve2gr.w $a0, $vr0, 2213; LA32-NEXT: vpickve2gr.w $a2, $vr0, 0214; LA32-NEXT: vpickve2gr.w $a3, $vr0, 3215; LA32-NEXT: vpickve2gr.w $a4, $vr0, 1216; LA32-NEXT: sltu $a5, $a4, $a3217; LA32-NEXT: xor $a6, $a4, $a3218; LA32-NEXT: sltui $a6, $a6, 1219; LA32-NEXT: masknez $a5, $a5, $a6220; LA32-NEXT: sltu $a7, $a2, $a0221; LA32-NEXT: maskeqz $a6, $a7, $a6222; LA32-NEXT: or $a5, $a6, $a5223; LA32-NEXT: masknez $a0, $a0, $a5224; LA32-NEXT: maskeqz $a2, $a2, $a5225; LA32-NEXT: or $a0, $a2, $a0226; LA32-NEXT: masknez $a2, $a3, $a5227; LA32-NEXT: maskeqz $a3, $a4, $a5228; LA32-NEXT: or $a2, $a3, $a2229; LA32-NEXT: st.w $a2, $a1, 4230; LA32-NEXT: st.w $a0, $a1, 0231; LA32-NEXT: ret232;233; LA64-LABEL: vec_reduce_umin_v2i64:234; LA64: # %bb.0:235; LA64-NEXT: vld $vr0, $a0, 0236; LA64-NEXT: vbsrl.v $vr1, $vr0, 8237; LA64-NEXT: vmin.du $vr0, $vr1, $vr0238; LA64-NEXT: vstelm.d $vr0, $a1, 0, 0239; LA64-NEXT: ret240 %v = load <2 x i64>, ptr %src241 %res = call i64 @llvm.vector.reduce.umin.v2i64(<2 x i64> %v)242 store i64 %res, ptr %dst243 ret void244}245