120 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,+lasx %s -o - | FileCheck %s --check-prefixes=CHECK,LA323; RUN: llc --mtriple=loongarch64 --mattr=+lasx %s -o - | FileCheck %s --check-prefixes=CHECK,LA644 5define void @vec_reduce_umin_v32i8(ptr %src, ptr %dst) nounwind {6; CHECK-LABEL: vec_reduce_umin_v32i8:7; CHECK: # %bb.0:8; CHECK-NEXT: xvld $xr0, $a0, 09; CHECK-NEXT: xvpermi.q $xr1, $xr0, 110; CHECK-NEXT: vmin.bu $vr0, $vr0, $vr111; CHECK-NEXT: vbsrl.v $vr1, $vr0, 812; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr013; CHECK-NEXT: vbsrl.v $vr1, $vr0, 414; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr015; CHECK-NEXT: vbsrl.v $vr1, $vr0, 216; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr017; CHECK-NEXT: vbsrl.v $vr1, $vr0, 118; CHECK-NEXT: vmin.bu $vr0, $vr1, $vr019; CHECK-NEXT: vstelm.b $vr0, $a1, 0, 020; CHECK-NEXT: ret21 %v = load <32 x i8>, ptr %src22 %res = call i8 @llvm.vector.reduce.umin.v32i8(<32 x i8> %v)23 store i8 %res, ptr %dst24 ret void25}26 27define void @vec_reduce_umin_v16i16(ptr %src, ptr %dst) nounwind {28; CHECK-LABEL: vec_reduce_umin_v16i16:29; CHECK: # %bb.0:30; CHECK-NEXT: xvld $xr0, $a0, 031; CHECK-NEXT: xvpermi.q $xr1, $xr0, 132; CHECK-NEXT: vmin.hu $vr0, $vr0, $vr133; CHECK-NEXT: vbsrl.v $vr1, $vr0, 834; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr035; CHECK-NEXT: vbsrl.v $vr1, $vr0, 436; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr037; CHECK-NEXT: vbsrl.v $vr1, $vr0, 238; CHECK-NEXT: vmin.hu $vr0, $vr1, $vr039; CHECK-NEXT: vstelm.h $vr0, $a1, 0, 040; CHECK-NEXT: ret41 %v = load <16 x i16>, ptr %src42 %res = call i16 @llvm.vector.reduce.umin.v16i16(<16 x i16> %v)43 store i16 %res, ptr %dst44 ret void45}46 47define void @vec_reduce_umin_v8i32(ptr %src, ptr %dst) nounwind {48; LA32-LABEL: vec_reduce_umin_v8i32:49; LA32: # %bb.0:50; LA32-NEXT: xvld $xr0, $a0, 051; LA32-NEXT: xvpermi.q $xr1, $xr0, 152; LA32-NEXT: vmin.wu $vr0, $vr0, $vr153; LA32-NEXT: vbsrl.v $vr1, $vr0, 854; LA32-NEXT: vmin.wu $vr0, $vr1, $vr055; LA32-NEXT: vbsrl.v $vr1, $vr0, 456; LA32-NEXT: vmin.wu $vr0, $vr1, $vr057; LA32-NEXT: vpickve2gr.w $a0, $vr0, 058; LA32-NEXT: st.w $a0, $a1, 059; LA32-NEXT: ret60;61; LA64-LABEL: vec_reduce_umin_v8i32:62; LA64: # %bb.0:63; LA64-NEXT: xvld $xr0, $a0, 064; LA64-NEXT: xvpermi.q $xr1, $xr0, 165; LA64-NEXT: vmin.wu $vr0, $vr0, $vr166; LA64-NEXT: vbsrl.v $vr1, $vr0, 867; LA64-NEXT: vmin.wu $vr0, $vr1, $vr068; LA64-NEXT: vbsrl.v $vr1, $vr0, 469; LA64-NEXT: vmin.wu $vr0, $vr1, $vr070; LA64-NEXT: vstelm.w $vr0, $a1, 0, 071; LA64-NEXT: ret72 %v = load <8 x i32>, ptr %src73 %res = call i32 @llvm.vector.reduce.umin.v8i32(<8 x i32> %v)74 store i32 %res, ptr %dst75 ret void76}77 78define void @vec_reduce_umin_v4i64(ptr %src, ptr %dst) nounwind {79; LA32-LABEL: vec_reduce_umin_v4i64:80; LA32: # %bb.0:81; LA32-NEXT: xvld $xr0, $a0, 082; LA32-NEXT: xvpermi.q $xr1, $xr0, 183; LA32-NEXT: vmin.du $vr0, $vr0, $vr184; LA32-NEXT: vpickve2gr.w $a0, $vr0, 385; LA32-NEXT: vpickve2gr.w $a2, $vr0, 186; LA32-NEXT: sltu $a3, $a2, $a087; LA32-NEXT: xor $a4, $a2, $a088; LA32-NEXT: sltui $a4, $a4, 189; LA32-NEXT: masknez $a3, $a3, $a490; LA32-NEXT: vpickve2gr.w $a5, $vr0, 291; LA32-NEXT: vpickve2gr.w $a6, $vr0, 092; LA32-NEXT: sltu $a7, $a6, $a593; LA32-NEXT: maskeqz $a4, $a7, $a494; LA32-NEXT: or $a3, $a4, $a395; LA32-NEXT: masknez $a4, $a5, $a396; LA32-NEXT: maskeqz $a5, $a6, $a397; LA32-NEXT: or $a4, $a5, $a498; LA32-NEXT: masknez $a0, $a0, $a399; LA32-NEXT: maskeqz $a2, $a2, $a3100; LA32-NEXT: or $a0, $a2, $a0101; LA32-NEXT: st.w $a0, $a1, 4102; LA32-NEXT: st.w $a4, $a1, 0103; LA32-NEXT: ret104;105; LA64-LABEL: vec_reduce_umin_v4i64:106; LA64: # %bb.0:107; LA64-NEXT: xvld $xr0, $a0, 0108; LA64-NEXT: xvpermi.q $xr1, $xr0, 1109; LA64-NEXT: vmin.du $vr0, $vr0, $vr1110; LA64-NEXT: vbsrl.v $vr1, $vr0, 8111; LA64-NEXT: vmin.du $vr0, $vr1, $vr0112; LA64-NEXT: vstelm.d $vr0, $a1, 0, 0113; LA64-NEXT: ret114 %v = load <4 x i64>, ptr %src115 %res = call i64 @llvm.vector.reduce.umin.v4i64(<4 x i64> %v)116 store i64 %res, ptr %dst117 ret void118}119 120