void iquant1_non_intra(short *src, short *dst, unsigned char *quant_mat,
                       int mquant) {
  int i;
  int val;
  int tmp;
  int tmp___0;
  int tmp___1;
  {
    i = 0;
    while (i < 64) {
      val = (int)*(src + i);
      if (val != 0) {
        if (val > 0) {
          tmp = 1;
        } else {
          tmp = -1;
        }
        val = (((2 * val + tmp) * (int)*(quant_mat + i)) * mquant) / 32;
        if ((val & 1) == 0) {
          if (val != 0) {
            if (val > 0) {
              tmp___0 = -1;
            } else {
              tmp___0 = 1;
            }
            val += tmp___0;
          }
        }
      }
      if (val > 2047) {
        *(dst + i) = (short)2047;
      } else {
        if (val < -2048) {
          tmp___1 = -2048;
        } else {
          tmp___1 = val;
        }
        *(dst + i) = (short)tmp___1;
      }
      i++;
    }
    return;
  }
}


x86 assembly (clang, -O0):
<iquant1_non_intra>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x40,-0x20(%rbp)
jge    1229 <iquant1_non_intra+0x129>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
je     11ca <iquant1_non_intra+0xca>
cmpl   $0x0,-0x24(%rbp)
jle    1153 <iquant1_non_intra+0x53>
movl   $0x1,-0x28(%rbp)
jmp    115a <iquant1_non_intra+0x5a>
movl   $0xffffffff,-0x28(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
add    -0x28(%rbp),%eax
mov    -0x18(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
imul   %ecx,%eax
imul   -0x1c(%rbp),%eax
mov    $0x20,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    11c5 <iquant1_non_intra+0xc5>
cmpl   $0x0,-0x24(%rbp)
je     11c0 <iquant1_non_intra+0xc0>
cmpl   $0x0,-0x24(%rbp)
jle    11b0 <iquant1_non_intra+0xb0>
movl   $0xffffffff,-0x2c(%rbp)
jmp    11b7 <iquant1_non_intra+0xb7>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11c5 <iquant1_non_intra+0xc5>
jmp    11ca <iquant1_non_intra+0xca>
cmpl   $0x7ff,-0x24(%rbp)
jle    11ea <iquant1_non_intra+0xea>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movw   $0x7ff,(%rax,%rcx,2)
jmp    121b <iquant1_non_intra+0x11b>
cmpl   $0xfffff800,-0x24(%rbp)
jge    1203 <iquant1_non_intra+0x103>
movl   $0xfffff800,-0x30(%rbp)
jmp    1209 <iquant1_non_intra+0x109>
mov    -0x24(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    111a <iquant1_non_intra+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<iquant1_non_intra>:
push   %rbx
xor    %r8d,%r8d
xor    %ebx,%ebx
jmp    1126 <iquant1_non_intra+0x26>
nopl   0x0(%rax,%rax,1)
mov    %eax,%r9d
mov    %r9w,(%rsi,%r8,2)
add    $0x1,%r8
cmp    $0x40,%r8
je     11a8 <iquant1_non_intra+0xa8>
movswl (%rdi,%r8,2),%r9d
mov    $0x0,%eax
test   %r9d,%r9d
je     1110 <iquant1_non_intra+0x10>
xor    %eax,%eax
test   %r9w,%r9w
setg   %al
add    %r9d,%r9d
lea    (%r9,%rax,2),%eax
add    $0xffffffff,%eax
movzbl (%rdx,%r8,1),%r9d
imul   %ecx,%eax
imul   %r9d,%eax
lea    0x1f(%rax),%r9d
test   %eax,%eax
cmovns %eax,%r9d
sar    $0x5,%r9d
lea    -0x20(%rax),%r10d
xor    %r11d,%r11d
cmp    $0x20,%eax
setl   %r11b
cmp    $0xffffffc1,%r10d
lea    -0x1(%r11,%r11,1),%eax
cmovae %ebx,%eax
test   $0x1,%r9b
je     1184 <iquant1_non_intra+0x84>
xor    %eax,%eax
add    %r9d,%eax
mov    $0x7ff,%r9w
cmp    $0x7ff,%eax
jg     1113 <iquant1_non_intra+0x13>
cmp    $0xfffff801,%eax
jge    1110 <iquant1_non_intra+0x10>
mov    $0xfffff800,%eax
jmp    1110 <iquant1_non_intra+0x10>
pop    %rbx
ret

LLVM IR (-O0):
define void @iquant1_non_intra(i16* %0, i16* %1, i8* %2, i32 %3) {
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i16* %0, i16** %5
store i16* %1, i16** %6
store i8* %2, i8** %7
store i32 %3, i32* %8
store i32 0, i32* %9
br label %14
14: ; preds = %84, %4
%15 = load i32, i32* %9
%16 = icmp slt i32 %15, 64
br i1 %16, label %17, label %87
17: ; preds = %14
%18 = load i16*, i16** %5
%19 = load i32, i32* %9
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i16, i16* %18, i64 %20
%22 = load i16, i16* %21
%23 = sext i16 %22 to i32
store i32 %23, i32* %10
%24 = load i32, i32* %10
%25 = icmp ne i32 %24, 0
br i1 %25, label %26, label %63
26: ; preds = %17
%27 = load i32, i32* %10
%28 = icmp sgt i32 %27, 0
br i1 %28, label %29, label %30
29: ; preds = %26
store i32 1, i32* %11
br label %31
30: ; preds = %26
store i32 -1, i32* %11
br label %31
31: ; preds = %30, %29
%32 = load i32, i32* %10
%33 = mul nsw i32 2, %32
%34 = load i32, i32* %11
%35 = add nsw i32 %33, %34
%36 = load i8*, i8** %7
%37 = load i32, i32* %9
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i8, i8* %36, i64 %38
%40 = load i8, i8* %39
%41 = zext i8 %40 to i32
%42 = mul nsw i32 %35, %41
%43 = load i32, i32* %8
%44 = mul nsw i32 %42, %43
%45 = sdiv i32 %44, 32
store i32 %45, i32* %10
%46 = load i32, i32* %10
%47 = and i32 %46, 1
%48 = icmp eq i32 %47, 0
br i1 %48, label %49, label %62
49: ; preds = %31
%50 = load i32, i32* %10
%51 = icmp ne i32 %50, 0
br i1 %51, label %52, label %61
52: ; preds = %49
%53 = load i32, i32* %10
%54 = icmp sgt i32 %53, 0
br i1 %54, label %55, label %56
55: ; preds = %52
store i32 -1, i32* %12
br label %57
56: ; preds = %52
store i32 1, i32* %12
br label %57
57: ; preds = %56, %55
%58 = load i32, i32* %12
%59 = load i32, i32* %10
%60 = add nsw i32 %59, %58
store i32 %60, i32* %10
br label %61
61: ; preds = %57, %49
br label %62
62: ; preds = %61, %31
br label %63
63: ; preds = %62, %17
%64 = load i32, i32* %10
%65 = icmp sgt i32 %64, 2047
br i1 %65, label %66, label %71
66: ; preds = %63
%67 = load i16*, i16** %6
%68 = load i32, i32* %9
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds i16, i16* %67, i64 %69
store i16 2047, i16* %70
br label %84
71: ; preds = %63
%72 = load i32, i32* %10
%73 = icmp slt i32 %72, -2048
br i1 %73, label %74, label %75
74: ; preds = %71
store i32 -2048, i32* %13
br label %77
75: ; preds = %71
%76 = load i32, i32* %10
store i32 %76, i32* %13
br label %77
77: ; preds = %75, %74
%78 = load i32, i32* %13
%79 = trunc i32 %78 to i16
%80 = load i16*, i16** %6
%81 = load i32, i32* %9
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i16, i16* %80, i64 %82
store i16 %79, i16* %83
br label %84
84: ; preds = %77, %66
%85 = load i32, i32* %9
%86 = add nsw i32 %85, 1
store i32 %86, i32* %9
br label %14
87: ; preds = %14
ret void
}

LLVM IR (-O2):
define void @iquant1_non_intra(i16* nocapture %0, i16* nocapture writeonly %1, i8* nocapture %2, i32 %3) {
br label %5
5: ; preds = %4, %38
%6 = phi i64 [ 0, %4 ], [ %41, %38 ]
%7 = getelementptr inbounds i16, i16* %0, i64 %6
%8 = load i16, i16* %7
%9 = icmp eq i16 %8, 0
br i1 %9, label %35, label %10
10: ; preds = %5
%11 = sext i16 %8 to i32
%12 = icmp sgt i16 %8, 0
%13 = select i1 %12, i32 1, i32 -1
%14 = shl nsw i32 %11, 1
%15 = add nsw i32 %14, %13
%16 = getelementptr inbounds i8, i8* %2, i64 %6
%17 = load i8, i8* %16
%18 = zext i8 %17 to i32
%19 = mul i32 %15, %3
%20 = mul i32 %19, %18
%21 = sdiv i32 %20, 32
%22 = and i32 %21, 1
%23 = icmp eq i32 %22, 0
%24 = add i32 %20, -32
%25 = icmp ult i32 %24, -63
%26 = select i1 %23, i1 %25, i1 false
%27 = icmp sgt i32 %20, 31
%28 = select i1 %27, i32 -1, i32 1
%29 = select i1 %26, i32 %28, i32 0
%30 = add nsw i32 %29, %21
%31 = icmp sgt i32 %30, 2047
br i1 %31, label %38, label %32
32: ; preds = %10
%33 = icmp sgt i32 %30, -2048
%34 = select i1 %33, i32 %30, i32 -2048
br label %35
35: ; preds = %32, %5
%36 = phi i32 [ 0, %5 ], [ %34, %32 ]
%37 = trunc i32 %36 to i16
br label %38
38: ; preds = %10, %35
%39 = phi i16 [ %37, %35 ], [ 2047, %10 ]
%40 = getelementptr inbounds i16, i16* %1, i64 %6
store i16 %39, i16* %40
%41 = add nuw nsw i64 %6, 1
%42 = icmp eq i64 %41, 64
br i1 %42, label %43, label %5
43: ; preds = %38
ret void
}