From a14238f89a3a545e2f2756e0d18ffa3831195324 Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Thu, 20 Mar 2025 18:40:23 +0800 Subject: [PATCH] sad: init --- Makefile | 2 + sad.ll | 527 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 529 insertions(+) create mode 100644 Makefile create mode 100644 sad.ll diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c56a708 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +sad.o: sad.ll + $(CC) -msimd -mcpu=sw8a -mllvm -sw64-allows-misaligned-memory-accesses -c $^ -o $@ \ No newline at end of file diff --git a/sad.ll b/sad.ll new file mode 100644 index 0000000..adc5d0e --- /dev/null +++ b/sad.ll @@ -0,0 +1,527 @@ +define dso_local i32 @x264_pixel_sad_16x16(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + br label %7 + +7: + %8 = phi i32 [ 0, %4 ], [ %24, %7 ] + %9 = phi i32 [ 0, %4 ], [ %21, %7 ] + %10 = phi i8* [ %0, %4 ], [ %22, %7 ] + %11 = phi i8* [ %2, %4 ], [ %23, %7 ] + %12 = bitcast i8* %10 to <16 x i8>* + %13 = load <16 x i8>, <16 x i8>* %12, align 1 + %14 = zext <16 x i8> %13 to <16 x i32> + %15 = bitcast i8* %11 to <16 x i8>* + %16 = load <16 x i8>, <16 x i8>* %15, align 1 + %17 = zext <16 x i8> %16 to <16 x i32> + %18 = sub nsw <16 x i32> %14, %17 + %19 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %18, i1 true) + %20 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %19) + %21 = add nsw i32 %20, %9 + %22 = getelementptr inbounds i8, i8* %10, i64 %5 + %23 = getelementptr inbounds i8, i8* %11, i64 %6 + %24 = add nuw nsw i32 %8, 1 + %25 = icmp eq i32 %24, 16 + br i1 %25, label %26, label %7 + +26: + ret i32 %21 +} + +define dso_local i32 @x264_pixel_sad_16x8(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + %7 = bitcast i8* %0 to <16 x i8>* + %8 = load <16 x i8>, <16 x i8>* %7, align 1 + %9 = zext <16 x i8> %8 to <16 x i32> + %10 = bitcast i8* %2 to <16 x i8>* + %11 = load <16 x i8>, <16 x i8>* %10, align 1 + %12 = zext <16 x i8> %11 to <16 x i32> + %13 = sub nsw <16 x i32> %9, %12 + %14 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %13, i1 true) + %15 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %14) + %16 = getelementptr inbounds i8, i8* %0, i64 %5 + %17 = getelementptr inbounds i8, i8* %2, i64 %6 + %18 = bitcast i8* %16 to <16 x i8>* + %19 = load <16 x i8>, <16 x i8>* %18, align 1 + %20 = zext <16 x i8> %19 to <16 x i32> + %21 = bitcast i8* %17 to <16 x i8>* + %22 = load <16 x i8>, <16 x i8>* %21, align 1 + %23 = zext <16 x i8> %22 to <16 x i32> + %24 = sub nsw <16 x i32> %20, %23 + %25 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %24, i1 true) + %26 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %25) + %27 = add nsw i32 %26, %15 + %28 = getelementptr inbounds i8, i8* %16, i64 %5 + %29 = getelementptr inbounds i8, i8* %17, i64 %6 + %30 = bitcast i8* %28 to <16 x i8>* + %31 = load <16 x i8>, <16 x i8>* %30, align 1 + %32 = zext <16 x i8> %31 to <16 x i32> + %33 = bitcast i8* %29 to <16 x i8>* + %34 = load <16 x i8>, <16 x i8>* %33, align 1 + %35 = zext <16 x i8> %34 to <16 x i32> + %36 = sub nsw <16 x i32> %32, %35 + %37 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %36, i1 true) + %38 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %37) + %39 = add nsw i32 %38, %27 + %40 = getelementptr inbounds i8, i8* %28, i64 %5 + %41 = getelementptr inbounds i8, i8* %29, i64 %6 + %42 = bitcast i8* %40 to <16 x i8>* + %43 = load <16 x i8>, <16 x i8>* %42, align 1 + %44 = zext <16 x i8> %43 to <16 x i32> + %45 = bitcast i8* %41 to <16 x i8>* + %46 = load <16 x i8>, <16 x i8>* %45, align 1 + %47 = zext <16 x i8> %46 to <16 x i32> + %48 = sub nsw <16 x i32> %44, %47 + %49 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %48, i1 true) + %50 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %49) + %51 = add nsw i32 %50, %39 + %52 = getelementptr inbounds i8, i8* %40, i64 %5 + %53 = getelementptr inbounds i8, i8* %41, i64 %6 + %54 = bitcast i8* %52 to <16 x i8>* + %55 = load <16 x i8>, <16 x i8>* %54, align 1 + %56 = zext <16 x i8> %55 to <16 x i32> + %57 = bitcast i8* %53 to <16 x i8>* + %58 = load <16 x i8>, <16 x i8>* %57, align 1 + %59 = zext <16 x i8> %58 to <16 x i32> + %60 = sub nsw <16 x i32> %56, %59 + %61 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %60, i1 true) + %62 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %61) + %63 = add nsw i32 %62, %51 + %64 = getelementptr inbounds i8, i8* %52, i64 %5 + %65 = getelementptr inbounds i8, i8* %53, i64 %6 + %66 = bitcast i8* %64 to <16 x i8>* + %67 = load <16 x i8>, <16 x i8>* %66, align 1 + %68 = zext <16 x i8> %67 to <16 x i32> + %69 = bitcast i8* %65 to <16 x i8>* + %70 = load <16 x i8>, <16 x i8>* %69, align 1 + %71 = zext <16 x i8> %70 to <16 x i32> + %72 = sub nsw <16 x i32> %68, %71 + %73 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %72, i1 true) + %74 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %73) + %75 = add nsw i32 %74, %63 + %76 = getelementptr inbounds i8, i8* %64, i64 %5 + %77 = getelementptr inbounds i8, i8* %65, i64 %6 + %78 = bitcast i8* %76 to <16 x i8>* + %79 = load <16 x i8>, <16 x i8>* %78, align 1 + %80 = zext <16 x i8> %79 to <16 x i32> + %81 = bitcast i8* %77 to <16 x i8>* + %82 = load <16 x i8>, <16 x i8>* %81, align 1 + %83 = zext <16 x i8> %82 to <16 x i32> + %84 = sub nsw <16 x i32> %80, %83 + %85 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %84, i1 true) + %86 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %85) + %87 = add nsw i32 %86, %75 + %88 = getelementptr inbounds i8, i8* %76, i64 %5 + %89 = getelementptr inbounds i8, i8* %77, i64 %6 + %90 = bitcast i8* %88 to <16 x i8>* + %91 = load <16 x i8>, <16 x i8>* %90, align 1 + %92 = zext <16 x i8> %91 to <16 x i32> + %93 = bitcast i8* %89 to <16 x i8>* + %94 = load <16 x i8>, <16 x i8>* %93, align 1 + %95 = zext <16 x i8> %94 to <16 x i32> + %96 = sub nsw <16 x i32> %92, %95 + %97 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %96, i1 true) + %98 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %97) + %99 = add nsw i32 %98, %87 + ret i32 %99 +} + +define dso_local i32 @x264_pixel_sad_8x16(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + br label %7 + +7: + %8 = phi i32 [ 0, %4 ], [ %24, %7 ] + %9 = phi i32 [ 0, %4 ], [ %21, %7 ] + %10 = phi i8* [ %0, %4 ], [ %22, %7 ] + %11 = phi i8* [ %2, %4 ], [ %23, %7 ] + %12 = bitcast i8* %10 to <8 x i8>* + %13 = load <8 x i8>, <8 x i8>* %12, align 1 + %14 = zext <8 x i8> %13 to <8 x i32> + %15 = bitcast i8* %11 to <8 x i8>* + %16 = load <8 x i8>, <8 x i8>* %15, align 1 + %17 = zext <8 x i8> %16 to <8 x i32> + %18 = sub nsw <8 x i32> %14, %17 + %19 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %18, i1 true) + %20 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %19) + %21 = add nsw i32 %20, %9 + %22 = getelementptr inbounds i8, i8* %10, i64 %5 + %23 = getelementptr inbounds i8, i8* %11, i64 %6 + %24 = add nuw nsw i32 %8, 1 + %25 = icmp eq i32 %24, 16 + br i1 %25, label %26, label %7 + +26: + ret i32 %21 +} + +define dso_local i32 @x264_pixel_sad_8x8(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + %7 = bitcast i8* %0 to <8 x i8>* + %8 = load <8 x i8>, <8 x i8>* %7, align 1 + %9 = zext <8 x i8> %8 to <8 x i32> + %10 = bitcast i8* %2 to <8 x i8>* + %11 = load <8 x i8>, <8 x i8>* %10, align 1 + %12 = zext <8 x i8> %11 to <8 x i32> + %13 = sub nsw <8 x i32> %9, %12 + %14 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %13, i1 true) + %15 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %14) + %16 = getelementptr inbounds i8, i8* %0, i64 %5 + %17 = getelementptr inbounds i8, i8* %2, i64 %6 + %18 = bitcast i8* %16 to <8 x i8>* + %19 = load <8 x i8>, <8 x i8>* %18, align 1 + %20 = zext <8 x i8> %19 to <8 x i32> + %21 = bitcast i8* %17 to <8 x i8>* + %22 = load <8 x i8>, <8 x i8>* %21, align 1 + %23 = zext <8 x i8> %22 to <8 x i32> + %24 = sub nsw <8 x i32> %20, %23 + %25 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %24, i1 true) + %26 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %25) + %27 = add nsw i32 %26, %15 + %28 = getelementptr inbounds i8, i8* %16, i64 %5 + %29 = getelementptr inbounds i8, i8* %17, i64 %6 + %30 = bitcast i8* %28 to <8 x i8>* + %31 = load <8 x i8>, <8 x i8>* %30, align 1 + %32 = zext <8 x i8> %31 to <8 x i32> + %33 = bitcast i8* %29 to <8 x i8>* + %34 = load <8 x i8>, <8 x i8>* %33, align 1 + %35 = zext <8 x i8> %34 to <8 x i32> + %36 = sub nsw <8 x i32> %32, %35 + %37 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %36, i1 true) + %38 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %37) + %39 = add nsw i32 %38, %27 + %40 = getelementptr inbounds i8, i8* %28, i64 %5 + %41 = getelementptr inbounds i8, i8* %29, i64 %6 + %42 = bitcast i8* %40 to <8 x i8>* + %43 = load <8 x i8>, <8 x i8>* %42, align 1 + %44 = zext <8 x i8> %43 to <8 x i32> + %45 = bitcast i8* %41 to <8 x i8>* + %46 = load <8 x i8>, <8 x i8>* %45, align 1 + %47 = zext <8 x i8> %46 to <8 x i32> + %48 = sub nsw <8 x i32> %44, %47 + %49 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %48, i1 true) + %50 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %49) + %51 = add nsw i32 %50, %39 + %52 = getelementptr inbounds i8, i8* %40, i64 %5 + %53 = getelementptr inbounds i8, i8* %41, i64 %6 + %54 = bitcast i8* %52 to <8 x i8>* + %55 = load <8 x i8>, <8 x i8>* %54, align 1 + %56 = zext <8 x i8> %55 to <8 x i32> + %57 = bitcast i8* %53 to <8 x i8>* + %58 = load <8 x i8>, <8 x i8>* %57, align 1 + %59 = zext <8 x i8> %58 to <8 x i32> + %60 = sub nsw <8 x i32> %56, %59 + %61 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %60, i1 true) + %62 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %61) + %63 = add nsw i32 %62, %51 + %64 = getelementptr inbounds i8, i8* %52, i64 %5 + %65 = getelementptr inbounds i8, i8* %53, i64 %6 + %66 = bitcast i8* %64 to <8 x i8>* + %67 = load <8 x i8>, <8 x i8>* %66, align 1 + %68 = zext <8 x i8> %67 to <8 x i32> + %69 = bitcast i8* %65 to <8 x i8>* + %70 = load <8 x i8>, <8 x i8>* %69, align 1 + %71 = zext <8 x i8> %70 to <8 x i32> + %72 = sub nsw <8 x i32> %68, %71 + %73 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %72, i1 true) + %74 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %73) + %75 = add nsw i32 %74, %63 + %76 = getelementptr inbounds i8, i8* %64, i64 %5 + %77 = getelementptr inbounds i8, i8* %65, i64 %6 + %78 = bitcast i8* %76 to <8 x i8>* + %79 = load <8 x i8>, <8 x i8>* %78, align 1 + %80 = zext <8 x i8> %79 to <8 x i32> + %81 = bitcast i8* %77 to <8 x i8>* + %82 = load <8 x i8>, <8 x i8>* %81, align 1 + %83 = zext <8 x i8> %82 to <8 x i32> + %84 = sub nsw <8 x i32> %80, %83 + %85 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %84, i1 true) + %86 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %85) + %87 = add nsw i32 %86, %75 + %88 = getelementptr inbounds i8, i8* %76, i64 %5 + %89 = getelementptr inbounds i8, i8* %77, i64 %6 + %90 = bitcast i8* %88 to <8 x i8>* + %91 = load <8 x i8>, <8 x i8>* %90, align 1 + %92 = zext <8 x i8> %91 to <8 x i32> + %93 = bitcast i8* %89 to <8 x i8>* + %94 = load <8 x i8>, <8 x i8>* %93, align 1 + %95 = zext <8 x i8> %94 to <8 x i32> + %96 = sub nsw <8 x i32> %92, %95 + %97 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %96, i1 true) + %98 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %97) + %99 = add nsw i32 %98, %87 + ret i32 %99 +} + +define dso_local i32 @x264_pixel_sad_8x4(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + %7 = bitcast i8* %0 to <8 x i8>* + %8 = load <8 x i8>, <8 x i8>* %7, align 1 + %9 = zext <8 x i8> %8 to <8 x i32> + %10 = bitcast i8* %2 to <8 x i8>* + %11 = load <8 x i8>, <8 x i8>* %10, align 1 + %12 = zext <8 x i8> %11 to <8 x i32> + %13 = sub nsw <8 x i32> %9, %12 + %14 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %13, i1 true) + %15 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %14) + %16 = getelementptr inbounds i8, i8* %0, i64 %5 + %17 = getelementptr inbounds i8, i8* %2, i64 %6 + %18 = bitcast i8* %16 to <8 x i8>* + %19 = load <8 x i8>, <8 x i8>* %18, align 1 + %20 = zext <8 x i8> %19 to <8 x i32> + %21 = bitcast i8* %17 to <8 x i8>* + %22 = load <8 x i8>, <8 x i8>* %21, align 1 + %23 = zext <8 x i8> %22 to <8 x i32> + %24 = sub nsw <8 x i32> %20, %23 + %25 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %24, i1 true) + %26 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %25) + %27 = add nsw i32 %26, %15 + %28 = getelementptr inbounds i8, i8* %16, i64 %5 + %29 = getelementptr inbounds i8, i8* %17, i64 %6 + %30 = bitcast i8* %28 to <8 x i8>* + %31 = load <8 x i8>, <8 x i8>* %30, align 1 + %32 = zext <8 x i8> %31 to <8 x i32> + %33 = bitcast i8* %29 to <8 x i8>* + %34 = load <8 x i8>, <8 x i8>* %33, align 1 + %35 = zext <8 x i8> %34 to <8 x i32> + %36 = sub nsw <8 x i32> %32, %35 + %37 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %36, i1 true) + %38 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %37) + %39 = add nsw i32 %38, %27 + %40 = getelementptr inbounds i8, i8* %28, i64 %5 + %41 = getelementptr inbounds i8, i8* %29, i64 %6 + %42 = bitcast i8* %40 to <8 x i8>* + %43 = load <8 x i8>, <8 x i8>* %42, align 1 + %44 = zext <8 x i8> %43 to <8 x i32> + %45 = bitcast i8* %41 to <8 x i8>* + %46 = load <8 x i8>, <8 x i8>* %45, align 1 + %47 = zext <8 x i8> %46 to <8 x i32> + %48 = sub nsw <8 x i32> %44, %47 + %49 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %48, i1 true) + %50 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %49) + %51 = add nsw i32 %50, %39 + ret i32 %51 +} + +define dso_local i32 @x264_pixel_sad_4x8(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + br label %7 + +7: + %8 = phi i32 [ 0, %4 ], [ %48, %7 ] + %9 = phi i32 [ 0, %4 ], [ %45, %7 ] + %10 = phi i8* [ %0, %4 ], [ %46, %7 ] + %11 = phi i8* [ %2, %4 ], [ %47, %7 ] + %12 = load i8, i8* %10, align 1 + %13 = zext i8 %12 to i32 + %14 = load i8, i8* %11, align 1 + %15 = zext i8 %14 to i32 + %16 = sub nsw i32 %13, %15 + %17 = tail call i32 @llvm.abs.i32(i32 %16, i1 true) + %18 = add nsw i32 %17, %9 + %19 = getelementptr inbounds i8, i8* %10, i64 1 + %20 = load i8, i8* %19, align 1 + %21 = zext i8 %20 to i32 + %22 = getelementptr inbounds i8, i8* %11, i64 1 + %23 = load i8, i8* %22, align 1 + %24 = zext i8 %23 to i32 + %25 = sub nsw i32 %21, %24 + %26 = tail call i32 @llvm.abs.i32(i32 %25, i1 true) + %27 = add nsw i32 %26, %18 + %28 = getelementptr inbounds i8, i8* %10, i64 2 + %29 = load i8, i8* %28, align 1 + %30 = zext i8 %29 to i32 + %31 = getelementptr inbounds i8, i8* %11, i64 2 + %32 = load i8, i8* %31, align 1 + %33 = zext i8 %32 to i32 + %34 = sub nsw i32 %30, %33 + %35 = tail call i32 @llvm.abs.i32(i32 %34, i1 true) + %36 = add nsw i32 %35, %27 + %37 = getelementptr inbounds i8, i8* %10, i64 3 + %38 = load i8, i8* %37, align 1 + %39 = zext i8 %38 to i32 + %40 = getelementptr inbounds i8, i8* %11, i64 3 + %41 = load i8, i8* %40, align 1 + %42 = zext i8 %41 to i32 + %43 = sub nsw i32 %39, %42 + %44 = tail call i32 @llvm.abs.i32(i32 %43, i1 true) + %45 = add nsw i32 %44, %36 + %46 = getelementptr inbounds i8, i8* %10, i64 %5 + %47 = getelementptr inbounds i8, i8* %11, i64 %6 + %48 = add nuw nsw i32 %8, 1 + %49 = icmp eq i32 %48, 8 + br i1 %49, label %50, label %7 + +50: + ret i32 %45 +} + +define dso_local i32 @x264_pixel_sad_4x4(i8* nocapture readonly %0, i32 %1, i8* nocapture readonly %2, i32 %3) local_unnamed_addr #0 { + %5 = sext i32 %1 to i64 + %6 = sext i32 %3 to i64 + %7 = load i8, i8* %0, align 1 + %8 = zext i8 %7 to i32 + %9 = load i8, i8* %2, align 1 + %10 = zext i8 %9 to i32 + %11 = sub nsw i32 %8, %10 + %12 = tail call i32 @llvm.abs.i32(i32 %11, i1 true) + %13 = getelementptr inbounds i8, i8* %0, i64 1 + %14 = load i8, i8* %13, align 1 + %15 = zext i8 %14 to i32 + %16 = getelementptr inbounds i8, i8* %2, i64 1 + %17 = load i8, i8* %16, align 1 + %18 = zext i8 %17 to i32 + %19 = sub nsw i32 %15, %18 + %20 = tail call i32 @llvm.abs.i32(i32 %19, i1 true) + %21 = add nuw nsw i32 %20, %12 + %22 = getelementptr inbounds i8, i8* %0, i64 2 + %23 = load i8, i8* %22, align 1 + %24 = zext i8 %23 to i32 + %25 = getelementptr inbounds i8, i8* %2, i64 2 + %26 = load i8, i8* %25, align 1 + %27 = zext i8 %26 to i32 + %28 = sub nsw i32 %24, %27 + %29 = tail call i32 @llvm.abs.i32(i32 %28, i1 true) + %30 = add nuw nsw i32 %29, %21 + %31 = getelementptr inbounds i8, i8* %0, i64 3 + %32 = load i8, i8* %31, align 1 + %33 = zext i8 %32 to i32 + %34 = getelementptr inbounds i8, i8* %2, i64 3 + %35 = load i8, i8* %34, align 1 + %36 = zext i8 %35 to i32 + %37 = sub nsw i32 %33, %36 + %38 = tail call i32 @llvm.abs.i32(i32 %37, i1 true) + %39 = add nuw nsw i32 %38, %30 + %40 = getelementptr inbounds i8, i8* %0, i64 %5 + %41 = getelementptr inbounds i8, i8* %2, i64 %6 + %42 = load i8, i8* %40, align 1 + %43 = zext i8 %42 to i32 + %44 = load i8, i8* %41, align 1 + %45 = zext i8 %44 to i32 + %46 = sub nsw i32 %43, %45 + %47 = tail call i32 @llvm.abs.i32(i32 %46, i1 true) + %48 = add nuw nsw i32 %47, %39 + %49 = getelementptr inbounds i8, i8* %40, i64 1 + %50 = load i8, i8* %49, align 1 + %51 = zext i8 %50 to i32 + %52 = getelementptr inbounds i8, i8* %41, i64 1 + %53 = load i8, i8* %52, align 1 + %54 = zext i8 %53 to i32 + %55 = sub nsw i32 %51, %54 + %56 = tail call i32 @llvm.abs.i32(i32 %55, i1 true) + %57 = add nuw nsw i32 %56, %48 + %58 = getelementptr inbounds i8, i8* %40, i64 2 + %59 = load i8, i8* %58, align 1 + %60 = zext i8 %59 to i32 + %61 = getelementptr inbounds i8, i8* %41, i64 2 + %62 = load i8, i8* %61, align 1 + %63 = zext i8 %62 to i32 + %64 = sub nsw i32 %60, %63 + %65 = tail call i32 @llvm.abs.i32(i32 %64, i1 true) + %66 = add nuw nsw i32 %65, %57 + %67 = getelementptr inbounds i8, i8* %40, i64 3 + %68 = load i8, i8* %67, align 1 + %69 = zext i8 %68 to i32 + %70 = getelementptr inbounds i8, i8* %41, i64 3 + %71 = load i8, i8* %70, align 1 + %72 = zext i8 %71 to i32 + %73 = sub nsw i32 %69, %72 + %74 = tail call i32 @llvm.abs.i32(i32 %73, i1 true) + %75 = add nuw nsw i32 %74, %66 + %76 = getelementptr inbounds i8, i8* %40, i64 %5 + %77 = getelementptr inbounds i8, i8* %41, i64 %6 + %78 = load i8, i8* %76, align 1 + %79 = zext i8 %78 to i32 + %80 = load i8, i8* %77, align 1 + %81 = zext i8 %80 to i32 + %82 = sub nsw i32 %79, %81 + %83 = tail call i32 @llvm.abs.i32(i32 %82, i1 true) + %84 = add nuw nsw i32 %83, %75 + %85 = getelementptr inbounds i8, i8* %76, i64 1 + %86 = load i8, i8* %85, align 1 + %87 = zext i8 %86 to i32 + %88 = getelementptr inbounds i8, i8* %77, i64 1 + %89 = load i8, i8* %88, align 1 + %90 = zext i8 %89 to i32 + %91 = sub nsw i32 %87, %90 + %92 = tail call i32 @llvm.abs.i32(i32 %91, i1 true) + %93 = add nuw nsw i32 %92, %84 + %94 = getelementptr inbounds i8, i8* %76, i64 2 + %95 = load i8, i8* %94, align 1 + %96 = zext i8 %95 to i32 + %97 = getelementptr inbounds i8, i8* %77, i64 2 + %98 = load i8, i8* %97, align 1 + %99 = zext i8 %98 to i32 + %100 = sub nsw i32 %96, %99 + %101 = tail call i32 @llvm.abs.i32(i32 %100, i1 true) + %102 = add nuw nsw i32 %101, %93 + %103 = getelementptr inbounds i8, i8* %76, i64 3 + %104 = load i8, i8* %103, align 1 + %105 = zext i8 %104 to i32 + %106 = getelementptr inbounds i8, i8* %77, i64 3 + %107 = load i8, i8* %106, align 1 + %108 = zext i8 %107 to i32 + %109 = sub nsw i32 %105, %108 + %110 = tail call i32 @llvm.abs.i32(i32 %109, i1 true) + %111 = add nuw nsw i32 %110, %102 + %112 = getelementptr inbounds i8, i8* %76, i64 %5 + %113 = getelementptr inbounds i8, i8* %77, i64 %6 + %114 = load i8, i8* %112, align 1 + %115 = zext i8 %114 to i32 + %116 = load i8, i8* %113, align 1 + %117 = zext i8 %116 to i32 + %118 = sub nsw i32 %115, %117 + %119 = tail call i32 @llvm.abs.i32(i32 %118, i1 true) + %120 = add nuw nsw i32 %119, %111 + %121 = getelementptr inbounds i8, i8* %112, i64 1 + %122 = load i8, i8* %121, align 1 + %123 = zext i8 %122 to i32 + %124 = getelementptr inbounds i8, i8* %113, i64 1 + %125 = load i8, i8* %124, align 1 + %126 = zext i8 %125 to i32 + %127 = sub nsw i32 %123, %126 + %128 = tail call i32 @llvm.abs.i32(i32 %127, i1 true) + %129 = add nuw nsw i32 %128, %120 + %130 = getelementptr inbounds i8, i8* %112, i64 2 + %131 = load i8, i8* %130, align 1 + %132 = zext i8 %131 to i32 + %133 = getelementptr inbounds i8, i8* %113, i64 2 + %134 = load i8, i8* %133, align 1 + %135 = zext i8 %134 to i32 + %136 = sub nsw i32 %132, %135 + %137 = tail call i32 @llvm.abs.i32(i32 %136, i1 true) + %138 = add nuw nsw i32 %137, %129 + %139 = getelementptr inbounds i8, i8* %112, i64 3 + %140 = load i8, i8* %139, align 1 + %141 = zext i8 %140 to i32 + %142 = getelementptr inbounds i8, i8* %113, i64 3 + %143 = load i8, i8* %142, align 1 + %144 = zext i8 %143 to i32 + %145 = sub nsw i32 %141, %144 + %146 = tail call i32 @llvm.abs.i32(i32 %145, i1 true) + %147 = add nuw nsw i32 %146, %138 + ret i32 %147 +} + +declare i32 @llvm.abs.i32(i32, i1 immarg) #1 + +declare <16 x i32> @llvm.abs.v16i32(<16 x i32>, i1 immarg) #1 + +declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>) #2 + +declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1 immarg) #1 + +declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>) #2 + +declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1 immarg) #1 + +declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>) #2 + +attributes #0 = { nofree nosync nounwind readonly uwtable "frame-pointer"="non-leaf" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+neon,+outline-atomics" } +attributes #1 = { nofree nosync nounwind readnone speculatable willreturn } +attributes #2 = { nofree nosync nounwind readnone willreturn } \ No newline at end of file