#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int abs(int);
int x264_mb_decimate_score(int *dct, int i_max) {
  static const int i_ds_table4[16] = {3, 2, 2, 1, 1, 1, 0, 0,
                                      0, 0, 0, 0, 0, 0, 0, 0};
  static const int i_ds_table8[64] = {
      3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
      1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  const int *ds_table = (i_max == 64) ? i_ds_table8 : i_ds_table4;
  int i_score = 0;
  int idx = i_max - 1;
  while (idx >= 0 && dct[idx] == 0)
    idx--;
  while (idx >= 0) {
    int i_run;
    if (abs(dct[idx--]) > 1)
      return 9;
    i_run = 0;
    while (idx >= 0 && dct[idx] == 0) {
      idx--;
      i_run++;
    }
    i_score += ds_table[i_run];
  }
  return i_score;
}


x86 assembly (clang, -O0):
<x264_mb_decimate_score>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x14(%rbp),%edx
lea    0xed7(%rip),%rax
lea    0xf10(%rip),%rcx
cmp    $0x40,%edx
cmove  %rcx,%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x28(%rbp)
mov    %al,-0x2d(%rbp)
jl     116c <x264_mb_decimate_score+0x5c>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
sete   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    117c <x264_mb_decimate_score+0x6c>
jmp    118a <x264_mb_decimate_score+0x7a>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    114b <x264_mb_decimate_score+0x3b>
jmp    118f <x264_mb_decimate_score+0x7f>
cmpl   $0x0,-0x28(%rbp)
jl     122d <x264_mb_decimate_score+0x11d>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edi
call   1030 <abs@plt>
cmp    $0x1,%eax
jle    11c8 <x264_mb_decimate_score+0xb8>
movl   $0x9,-0x4(%rbp)
jmp    1233 <x264_mb_decimate_score+0x123>
movl   $0x0,-0x2c(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x28(%rbp)
mov    %al,-0x2e(%rbp)
jl     11f0 <x264_mb_decimate_score+0xe0>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
sete   %al
mov    %al,-0x2e(%rbp)
mov    -0x2e(%rbp),%al
test   $0x1,%al
jne    1200 <x264_mb_decimate_score+0xf0>
jmp    1217 <x264_mb_decimate_score+0x107>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11cf <x264_mb_decimate_score+0xbf>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    118f <x264_mb_decimate_score+0x7f>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<x264_mb_decimate_score>:
cmp    $0x40,%esi
lea    0xf36(%rip),%rax
lea    0xeef(%rip),%r8
cmove  %rax,%r8
mov    %esi,%eax
xor    %r10d,%r10d
test   %esi,%esi
cmovs  %esi,%r10d
add    $0xffffffff,%r10d
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %eax,%eax
jle    1143 <x264_mb_decimate_score+0x43>
add    $0xffffffffffffffff,%rax
mov    %eax,%ecx
cmpl   $0x0,(%rdi,%rcx,4)
je     1130 <x264_mb_decimate_score+0x30>
mov    %eax,%r10d
xor    %eax,%eax
test   %r10d,%r10d
jns    1160 <x264_mb_decimate_score+0x60>
ret
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
mov    %ecx,%ecx
add    (%r8,%rcx,4),%eax
mov    %r9d,%r10d
test   %r9d,%r9d
js     114a <x264_mb_decimate_score+0x4a>
mov    %r10d,%ecx
mov    (%rdi,%rcx,4),%ecx
mov    %ecx,%esi
neg    %esi
cmovs  %ecx,%esi
cmp    $0x1,%esi
ja     11b5 <x264_mb_decimate_score+0xb5>
mov    $0xffffffff,%r9d
test   %r10d,%r10d
je     1150 <x264_mb_decimate_score+0x50>
lea    -0x1(%r10),%esi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %esi,%edx
cmpl   $0x0,(%rdi,%rdx,4)
jne    11b0 <x264_mb_decimate_score+0xb0>
add    $0x1,%ecx
add    $0xffffffff,%esi
jb     1190 <x264_mb_decimate_score+0x90>
mov    %r10d,%ecx
jmp    1152 <x264_mb_decimate_score+0x52>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %esi,%r9d
jmp    1152 <x264_mb_decimate_score+0x52>
mov    $0x9,%eax
ret

LLVM IR (-O0):
@x264_mb_decimate_score.i_ds_table4 = internal constant <{ i32, i32, i32, i32, i32, i32, [10 x i32] }> <{ i32 3, i32 2, i32 2, i32 1, i32 1, i32 1, [10 x i32] zeroinitializer }>
@x264_mb_decimate_score.i_ds_table8 = internal constant <{ [24 x i32], [40 x i32] }> <{ [24 x i32] [i32 3, i32 3, i32 3, i32 3, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1], [40 x i32] zeroinitializer }>
define i32 @x264_mb_decimate_score(i32* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32*
%5 = alloca i32
%6 = alloca i32*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i32* %0, i32** %4
store i32 %1, i32* %5
%10 = load i32, i32* %5
%11 = icmp eq i32 %10, 64
%12 = zext i1 %11 to i64
%13 = select i1 %11, i32* getelementptr inbounds ([64 x i32], [64 x i32]* bitcast (<{ [24 x i32], [40 x i32] }>* @x264_mb_decimate_score.i_ds_table8 to [64 x i32]*), i64 0, i64 0), i32* getelementptr inbounds ([16 x i32], [16 x i32]* bitcast (<{ i32, i32, i32, i32, i32, i32, [10 x i32] }>* @x264_mb_decimate_score.i_ds_table4 to [16 x i32]*), i64 0, i64 0)
store i32* %13, i32** %6
store i32 0, i32* %7
%14 = load i32, i32* %5
%15 = sub nsw i32 %14, 1
store i32 %15, i32* %8
br label %16
16: ; preds = %28, %2
%17 = load i32, i32* %8
%18 = icmp sge i32 %17, 0
br i1 %18, label %19, label %26
19: ; preds = %16
%20 = load i32*, i32** %4
%21 = load i32, i32* %8
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i32, i32* %20, i64 %22
%24 = load i32, i32* %23
%25 = icmp eq i32 %24, 0
br label %26
26: ; preds = %19, %16
%27 = phi i1 [ false, %16 ], [ %25, %19 ]
br i1 %27, label %28, label %31
28: ; preds = %26
%29 = load i32, i32* %8
%30 = add nsw i32 %29, -1
store i32 %30, i32* %8
br label %16
31: ; preds = %26
br label %32
32: ; preds = %63, %31
%33 = load i32, i32* %8
%34 = icmp sge i32 %33, 0
br i1 %34, label %35, label %71
35: ; preds = %32
%36 = load i32*, i32** %4
%37 = load i32, i32* %8
%38 = add nsw i32 %37, -1
store i32 %38, i32* %8
%39 = sext i32 %37 to i64
%40 = getelementptr inbounds i32, i32* %36, i64 %39
%41 = load i32, i32* %40
%42 = call i32 @abs(i32 %41)
%43 = icmp sgt i32 %42, 1
br i1 %43, label %44, label %45
44: ; preds = %35
store i32 9, i32* %3
br label %73
45: ; preds = %35
store i32 0, i32* %9
br label %46
46: ; preds = %58, %45
%47 = load i32, i32* %8
%48 = icmp sge i32 %47, 0
br i1 %48, label %49, label %56
49: ; preds = %46
%50 = load i32*, i32** %4
%51 = load i32, i32* %8
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i32, i32* %50, i64 %52
%54 = load i32, i32* %53
%55 = icmp eq i32 %54, 0
br label %56
56: ; preds = %49, %46
%57 = phi i1 [ false, %46 ], [ %55, %49 ]
br i1 %57, label %58, label %63
58: ; preds = %56
%59 = load i32, i32* %8
%60 = add nsw i32 %59, -1
store i32 %60, i32* %8
%61 = load i32, i32* %9
%62 = add nsw i32 %61, 1
store i32 %62, i32* %9
br label %46
63: ; preds = %56
%64 = load i32*, i32** %6
%65 = load i32, i32* %9
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds i32, i32* %64, i64 %66
%68 = load i32, i32* %67
%69 = load i32, i32* %7
%70 = add nsw i32 %69, %68
store i32 %70, i32* %7
br label %32
71: ; preds = %32
%72 = load i32, i32* %7
store i32 %72, i32* %3
br label %73
73: ; preds = %71, %44
%74 = load i32, i32* %3
ret i32 %74
}

LLVM IR (-O2):
@x264_mb_decimate_score.i_ds_table4 = internal unnamed_addr constant <{ i32, i32, i32, i32, i32, i32, [10 x i32] }> <{ i32 3, i32 2, i32 2, i32 1, i32 1, i32 1, [10 x i32] zeroinitializer }>
@x264_mb_decimate_score.i_ds_table8 = internal unnamed_addr constant <{ [24 x i32], [40 x i32] }> <{ [24 x i32] [i32 3, i32 3, i32 3, i32 3, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1], [40 x i32] zeroinitializer }>
define i32 @x264_mb_decimate_score(i32* nocapture %0, i32 %1) {
%3 = icmp eq i32 %1, 64
%4 = select i1 %3, i32* getelementptr inbounds (<{ [24 x i32], [40 x i32] }>, <{ [24 x i32], [40 x i32] }>* @x264_mb_decimate_score.i_ds_table8, i64 0, i32 0, i64 0), i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32, [10 x i32] }>, <{ i32, i32, i32, i32, i32, i32, [10 x i32] }>* @x264_mb_decimate_score.i_ds_table4, i64 0, i32 0)
%5 = zext i32 %1 to i64
%6 = call i32 @llvm.smin.i32(i32 %1, i32 0)
%7 = add i32 %6, -1
br label %8
8: ; preds = %13, %2
%9 = phi i64 [ %10, %13 ], [ %5, %2 ]
%10 = add nsw i64 %9, -1
%11 = trunc i64 %9 to i32
%12 = icmp sgt i32 %11, 0
br i1 %12, label %13, label %20
13: ; preds = %8
%14 = and i64 %10, 4294967295
%15 = getelementptr inbounds i32, i32* %0, i64 %14
%16 = load i32, i32* %15
%17 = icmp eq i32 %16, 0
br i1 %17, label %8, label %18
18: ; preds = %13
%19 = trunc i64 %10 to i32
br label %20
20: ; preds = %8, %18
%21 = phi i32 [ %19, %18 ], [ %7, %8 ]
%22 = icmp sgt i32 %21, -1
br i1 %22, label %23, label %52
23: ; preds = %20, %44
%24 = phi i32 [ %46, %44 ], [ %21, %20 ]
%25 = phi i32 [ %50, %44 ], [ 0, %20 ]
%26 = zext i32 %24 to i64
%27 = getelementptr inbounds i32, i32* %0, i64 %26
%28 = load i32, i32* %27
%29 = tail call i32 @llvm.abs.i32(i32 %28, i1 true)
%30 = icmp ugt i32 %29, 1
br i1 %30, label %52, label %31
31: ; preds = %23
%32 = icmp eq i32 %24, 0
br i1 %32, label %44, label %33
33: ; preds = %31, %41
%34 = phi i32 [ %36, %41 ], [ %24, %31 ]
%35 = phi i32 [ %42, %41 ], [ 0, %31 ]
%36 = add nsw i32 %34, -1
%37 = zext i32 %36 to i64
%38 = getelementptr inbounds i32, i32* %0, i64 %37
%39 = load i32, i32* %38
%40 = icmp eq i32 %39, 0
br i1 %40, label %41, label %44
41: ; preds = %33
%42 = add nuw i32 %35, 1
%43 = icmp eq i32 %42, %24
br i1 %43, label %44, label %33
44: ; preds = %41, %33, %31
%45 = phi i32 [ 0, %31 ], [ %35, %33 ], [ %24, %41 ]
%46 = phi i32 [ -1, %31 ], [ %36, %33 ], [ -1, %41 ]
%47 = zext i32 %45 to i64
%48 = getelementptr inbounds i32, i32* %4, i64 %47
%49 = load i32, i32* %48
%50 = add nsw i32 %49, %25
%51 = icmp sgt i32 %46, -1
br i1 %51, label %23, label %52
52: ; preds = %44, %23, %20
%53 = phi i32 [ 0, %20 ], [ %50, %44 ], [ 9, %23 ]
ret i32 %53
}