1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s 3 4define void @ctpop_v16i8(ptr %src, ptr %dst) nounwind { 5; CHECK-LABEL: ctpop_v16i8: 6; CHECK: # %bb.0: 7; CHECK-NEXT: vld $vr0, $a0, 0 8; CHECK-NEXT: vpcnt.b $vr0, $vr0 9; CHECK-NEXT: vst $vr0, $a1, 0 10; CHECK-NEXT: ret 11 %v = load <16 x i8>, ptr %src 12 %res = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %v) 13 store <16 x i8> %res, ptr %dst 14 ret void 15} 16 17define void @ctpop_v8i16(ptr %src, ptr %dst) nounwind { 18; CHECK-LABEL: ctpop_v8i16: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vld $vr0, $a0, 0 21; CHECK-NEXT: vpcnt.h $vr0, $vr0 22; CHECK-NEXT: vst $vr0, $a1, 0 23; CHECK-NEXT: ret 24 %v = load <8 x i16>, ptr %src 25 %res = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %v) 26 store <8 x i16> %res, ptr %dst 27 ret void 28} 29 30define void @ctpop_v4i32(ptr %src, ptr %dst) nounwind { 31; CHECK-LABEL: ctpop_v4i32: 32; CHECK: # %bb.0: 33; CHECK-NEXT: vld $vr0, $a0, 0 34; CHECK-NEXT: vpcnt.w $vr0, $vr0 35; CHECK-NEXT: vst $vr0, $a1, 0 36; CHECK-NEXT: ret 37 %v = load <4 x i32>, ptr %src 38 %res = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %v) 39 store <4 x i32> %res, ptr %dst 40 ret void 41} 42 43define void @ctpop_v2i64(ptr %src, ptr %dst) nounwind { 44; CHECK-LABEL: ctpop_v2i64: 45; CHECK: # %bb.0: 46; CHECK-NEXT: vld $vr0, $a0, 0 47; CHECK-NEXT: vpcnt.d $vr0, $vr0 48; CHECK-NEXT: vst $vr0, $a1, 0 49; CHECK-NEXT: ret 50 %v = load <2 x i64>, ptr %src 51 %res = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %v) 52 store <2 x i64> %res, ptr %dst 53 ret void 54} 55 56define void @ctlz_v16i8(ptr %src, ptr %dst) nounwind { 57; CHECK-LABEL: ctlz_v16i8: 58; CHECK: # %bb.0: 59; CHECK-NEXT: vld $vr0, $a0, 0 60; CHECK-NEXT: vclz.b $vr0, $vr0 61; CHECK-NEXT: vst $vr0, $a1, 0 62; CHECK-NEXT: ret 63 %v = load <16 x i8>, ptr %src 64 %res = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %v, i1 false) 65 store <16 x i8> %res, ptr %dst 66 ret void 67} 68 69define void @ctlz_v8i16(ptr %src, ptr %dst) nounwind { 70; CHECK-LABEL: ctlz_v8i16: 71; CHECK: # %bb.0: 72; CHECK-NEXT: vld $vr0, $a0, 0 73; CHECK-NEXT: vclz.h $vr0, $vr0 74; CHECK-NEXT: vst $vr0, $a1, 0 75; CHECK-NEXT: ret 76 %v = load <8 x i16>, ptr %src 77 %res = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %v, i1 false) 78 store <8 x i16> %res, ptr %dst 79 ret void 80} 81 82define void @ctlz_v4i32(ptr %src, ptr %dst) nounwind { 83; CHECK-LABEL: ctlz_v4i32: 84; CHECK: # %bb.0: 85; CHECK-NEXT: vld $vr0, $a0, 0 86; CHECK-NEXT: vclz.w $vr0, $vr0 87; CHECK-NEXT: vst $vr0, $a1, 0 88; CHECK-NEXT: ret 89 %v = load <4 x i32>, ptr %src 90 %res = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %v, i1 false) 91 store <4 x i32> %res, ptr %dst 92 ret void 93} 94 95define void @ctlz_v2i64(ptr %src, ptr %dst) nounwind { 96; CHECK-LABEL: ctlz_v2i64: 97; CHECK: # %bb.0: 98; CHECK-NEXT: vld $vr0, $a0, 0 99; CHECK-NEXT: vclz.d $vr0, $vr0 100; CHECK-NEXT: vst $vr0, $a1, 0 101; CHECK-NEXT: ret 102 %v = load <2 x i64>, ptr %src 103 %res = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %v, i1 false) 104 store <2 x i64> %res, ptr %dst 105 ret void 106} 107 108declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>) 109declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>) 110declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>) 111declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>) 112declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1) 113declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1) 114declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1) 115declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) 116