; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -march=hexagon < %s | FileCheck %s define void @f0(ptr %a0, ptr %a1, ptr %a2) #0 { ; CHECK-LABEL: f0: ; CHECK: // %bb.0: // %b0 ; CHECK-NEXT: { ; CHECK-NEXT: v0 = vmem(r0+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1 = vmem(r1+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v2.w = vmpye(v0.w,v1.uh) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v2.w += vmpyo(v0.w,v1.h):<<1:sat:shift ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: vmem(r2+#0) = v2 ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: jumpr r31 ; CHECK-NEXT: } b0: %v0 = load <32 x i32>, ptr %a0, align 128 %v1 = load <32 x i32>, ptr %a1, align 128 %v2 = sext <32 x i32> %v0 to <32 x i64> %v3 = sext <32 x i32> %v1 to <32 x i64> %v4 = mul nsw <32 x i64> %v2, %v3 %v5 = lshr <32 x i64> %v4, %v6 = trunc <32 x i64> %v5 to <32 x i32> store <32 x i32> %v6, ptr %a2, align 128 ret void } define void @f1(ptr %a0, ptr %a1, ptr %a2) #0 { ; CHECK-LABEL: f1: ; CHECK: // %bb.0: // %b0 ; CHECK-NEXT: { ; CHECK-NEXT: v0 = vmem(r0+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1 = vmem(r1+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v2.w = vmpye(v0.w,v1.uh) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v2.w += vmpyo(v0.w,v1.h):<<1:rnd:sat:shift ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: vmem(r2+#0) = v2 ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: jumpr r31 ; CHECK-NEXT: } b0: %v0 = load <32 x i32>, ptr %a0, align 128 %v1 = load <32 x i32>, ptr %a1, align 128 %v2 = sext <32 x i32> %v0 to <32 x i64> %v3 = sext <32 x i32> %v1 to <32 x i64> %v4 = mul nsw <32 x i64> %v2, %v3 %v5 = add nsw <32 x i64> %v4, %v6 = lshr <32 x i64> %v5, %v7 = trunc <32 x i64> %v6 to <32 x i32> store <32 x i32> %v7, ptr %a2, align 128 ret void } define void @f2(ptr %a0, ptr %a1, ptr %a2) #0 { ; CHECK-LABEL: f2: ; CHECK: // %bb.0: // %b0 ; CHECK-NEXT: { ; CHECK-NEXT: v0 = vmem(r1+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: r7 = #124 ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: r3 = #15 ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1 = vmem(r0+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1:0.w = vmpy(v0.h,v1.h) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1:0 = vshuff(v1,v0,r7) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v0.uw = vlsr(v0.uw,r3) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1.uw = vlsr(v1.uw,r3) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v0.h = vpacke(v1.w,v0.w) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: vmem(r2+#0) = v0 ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: jumpr r31 ; CHECK-NEXT: } b0: %v0 = load <64 x i16>, ptr %a0, align 128 %v1 = load <64 x i16>, ptr %a1, align 128 %v2 = sext <64 x i16> %v0 to <64 x i32> %v3 = sext <64 x i16> %v1 to <64 x i32> %v4 = mul nsw <64 x i32> %v2, %v3 %v5 = lshr <64 x i32> %v4, %v6 = trunc <64 x i32> %v5 to <64 x i16> store <64 x i16> %v6, ptr %a2, align 128 ret void } define void @f3(ptr %a0, ptr %a1, ptr %a2) #0 { ; CHECK-LABEL: f3: ; CHECK: // %bb.0: // %b0 ; CHECK-NEXT: { ; CHECK-NEXT: v0 = vmem(r0+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v1 = vmem(r1+#0) ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: v0.h = vmpy(v0.h,v1.h):<<1:rnd:sat ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: vmem(r2+#0) = v0 ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: jumpr r31 ; CHECK-NEXT: } b0: %v0 = load <64 x i16>, ptr %a0, align 128 %v1 = load <64 x i16>, ptr %a1, align 128 %v2 = sext <64 x i16> %v0 to <64 x i32> %v3 = sext <64 x i16> %v1 to <64 x i32> %v4 = mul nsw <64 x i32> %v2, %v3 %v5 = add nsw <64 x i32> %v4, %v6 = lshr <64 x i32> %v5, %v7 = trunc <64 x i32> %v6 to <64 x i16> store <64 x i16> %v7, ptr %a2, align 128 ret void } attributes #0 = { nounwind "target-features"="+v68,+hvxv68,+hvx-length128b,-packets" }