sad: init

This commit is contained in:
2025-03-20 18:40:23 +08:00
commit a14238f89a
2 changed files with 529 additions and 0 deletions

2
Makefile Normal file
View File

@@ -0,0 +1,2 @@
sad.o: sad.ll
$(CC) -msimd -mcpu=sw8a -mllvm -sw64-allows-misaligned-memory-accesses -c $^ -o $@

527
sad.ll Normal file
View File

@@ -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 }