void dct_unquantize_h263_inter_c(short *block, int n, int qscale, int nCoeffs) {
  int i, level, qmul, qadd;
  qadd = (qscale - 1) | 1;
  qmul = qscale << 1;
  for (i = 0; i <= nCoeffs; i++) {
    level = block[i];
    if (level < 0)
      level = level * qmul - qadd;
    else
      level = level * qmul + qadd;
    block[i] = level;
  }
}


x86 assembly (clang, -O0):
<dct_unquantize_h263_inter_c>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
or     $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     1191 <dct_unquantize_h263_inter_c+0x91>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jge    1164 <dct_unquantize_h263_inter_c+0x64>
mov    -0x1c(%rbp),%eax
imul   -0x20(%rbp),%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1171 <dct_unquantize_h263_inter_c+0x71>
mov    -0x1c(%rbp),%eax
imul   -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    112d <dct_unquantize_h263_inter_c+0x2d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dct_unquantize_h263_inter_c>:
test   %ecx,%ecx
js     13d2 <dct_unquantize_h263_inter_c+0x2d2>
lea    -0x1(%rdx),%r11d
or     $0x1,%r11d
add    %edx,%edx
mov    %r11d,%r9d
neg    %r9d
lea    0x1(%rcx),%r8d
cmp    $0x7,%ecx
jae    1128 <dct_unquantize_h263_inter_c+0x28>
xor    %ecx,%ecx
jmp    13b0 <dct_unquantize_h263_inter_c+0x2b0>
mov    %r8d,%ecx
and    $0xfffffff8,%ecx
movd   %edx,%xmm0
pshufd $0x0,%xmm0,%xmm9
movd   %r9d,%xmm0
pshufd $0x0,%xmm0,%xmm0
movd   %r11d,%xmm1
pshufd $0x0,%xmm1,%xmm8
lea    -0x8(%rcx),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
pshufd $0xf5,%xmm9,%xmm3
test   %rax,%rax
je     13d3 <dct_unquantize_h263_inter_c+0x2d3>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu (%rdi,%rsi,2),%xmm7
movdqu 0x10(%rdi,%rsi,2),%xmm4
movdqa %xmm7,%xmm1
punpcklwd %xmm1,%xmm1
pxor   %xmm6,%xmm6
pcmpgtw %xmm7,%xmm6
punpckhwd %xmm7,%xmm7
punpcklwd %xmm6,%xmm5
psrad  $0x10,%xmm5
punpckhwd %xmm6,%xmm6
psrad  $0x10,%xmm6
movdqa %xmm9,%xmm2
pmuludq %xmm7,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm7,%xmm7
pmuludq %xmm3,%xmm7
pshufd $0xe8,%xmm7,%xmm7
punpckldq %xmm7,%xmm2
movdqa %xmm9,%xmm7
pmuludq %xmm1,%xmm7
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm3,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm7
movdqa %xmm0,%xmm1
pand   %xmm6,%xmm1
pandn  %xmm8,%xmm6
por    %xmm1,%xmm6
paddd  %xmm2,%xmm6
movdqa %xmm0,%xmm1
pand   %xmm5,%xmm1
pandn  %xmm8,%xmm5
por    %xmm1,%xmm5
paddd  %xmm7,%xmm5
pslld  $0x10,%xmm6
psrad  $0x10,%xmm6
pslld  $0x10,%xmm5
psrad  $0x10,%xmm5
packssdw %xmm6,%xmm5
movdqu %xmm5,(%rdi,%rsi,2)
movdqa %xmm4,%xmm1
punpcklwd %xmm1,%xmm1
pxor   %xmm2,%xmm2
pcmpgtw %xmm4,%xmm2
punpckhwd %xmm4,%xmm4
punpcklwd %xmm2,%xmm5
psrad  $0x10,%xmm5
punpckhwd %xmm2,%xmm6
psrad  $0x10,%xmm6
movdqa %xmm9,%xmm2
pmuludq %xmm4,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm4,%xmm4
pmuludq %xmm3,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm2
movdqa %xmm9,%xmm4
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm3,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm4
movdqa %xmm0,%xmm1
pand   %xmm6,%xmm1
pandn  %xmm8,%xmm6
por    %xmm1,%xmm6
paddd  %xmm2,%xmm6
movdqa %xmm0,%xmm1
pand   %xmm5,%xmm1
pandn  %xmm8,%xmm5
por    %xmm1,%xmm5
paddd  %xmm4,%xmm5
pslld  $0x10,%xmm6
psrad  $0x10,%xmm6
pslld  $0x10,%xmm5
psrad  $0x10,%xmm5
packssdw %xmm6,%xmm5
movdqu %xmm5,0x10(%rdi,%rsi,2)
add    $0x10,%rsi
add    $0xfffffffffffffffe,%rax
jne    1180 <dct_unquantize_h263_inter_c+0x80>
test   $0x1,%r10b
je     13a9 <dct_unquantize_h263_inter_c+0x2a9>
movdqu (%rdi,%rsi,2),%xmm1
movdqa %xmm1,%xmm2
punpcklwd %xmm2,%xmm2
pxor   %xmm5,%xmm5
pcmpgtw %xmm1,%xmm5
punpckhwd %xmm1,%xmm1
punpcklwd %xmm5,%xmm4
psrad  $0x10,%xmm4
punpckhwd %xmm5,%xmm5
psrad  $0x10,%xmm5
movdqa %xmm9,%xmm6
pmuludq %xmm1,%xmm6
pshufd $0xe8,%xmm6,%xmm6
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm3,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm6
pmuludq %xmm2,%xmm9
pshufd $0xe8,%xmm9,%xmm1
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm3,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
movdqa %xmm0,%xmm2
pand   %xmm5,%xmm2
pandn  %xmm8,%xmm5
por    %xmm2,%xmm5
paddd  %xmm6,%xmm5
pand   %xmm4,%xmm0
pandn  %xmm8,%xmm4
por    %xmm0,%xmm4
paddd  %xmm1,%xmm4
pslld  $0x10,%xmm5
psrad  $0x10,%xmm5
pslld  $0x10,%xmm4
psrad  $0x10,%xmm4
packssdw %xmm5,%xmm4
movdqu %xmm4,(%rdi,%rsi,2)
cmp    %r8,%rcx
je     13d2 <dct_unquantize_h263_inter_c+0x2d2>
xchg   %ax,%ax
movzwl (%rdi,%rcx,2),%eax
mov    %eax,%esi
imul   %edx,%esi
test   %ax,%ax
mov    %r11d,%eax
cmovs  %r9d,%eax
add    %esi,%eax
mov    %ax,(%rdi,%rcx,2)
add    $0x1,%rcx
cmp    %rcx,%r8
jne    13b0 <dct_unquantize_h263_inter_c+0x2b0>
ret
xor    %esi,%esi
test   $0x1,%r10b
jne    12fe <dct_unquantize_h263_inter_c+0x1fe>
jmp    13a9 <dct_unquantize_h263_inter_c+0x2a9>

LLVM IR (-O0):
define void @dct_unquantize_h263_inter_c(i16* %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i16*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store i16* %0, i16** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%13 = load i32, i32* %7
%14 = sub nsw i32 %13, 1
%15 = or i32 %14, 1
store i32 %15, i32* %12
%16 = load i32, i32* %7
%17 = shl i32 %16, 1
store i32 %17, i32* %11
store i32 0, i32* %9
br label %18
18: ; preds = %50, %4
%19 = load i32, i32* %9
%20 = load i32, i32* %8
%21 = icmp sle i32 %19, %20
br i1 %21, label %22, label %53
22: ; preds = %18
%23 = load i16*, i16** %5
%24 = load i32, i32* %9
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i16, i16* %23, i64 %25
%27 = load i16, i16* %26
%28 = sext i16 %27 to i32
store i32 %28, i32* %10
%29 = load i32, i32* %10
%30 = icmp slt i32 %29, 0
br i1 %30, label %31, label %37
31: ; preds = %22
%32 = load i32, i32* %10
%33 = load i32, i32* %11
%34 = mul nsw i32 %32, %33
%35 = load i32, i32* %12
%36 = sub nsw i32 %34, %35
store i32 %36, i32* %10
br label %43
37: ; preds = %22
%38 = load i32, i32* %10
%39 = load i32, i32* %11
%40 = mul nsw i32 %38, %39
%41 = load i32, i32* %12
%42 = add nsw i32 %40, %41
store i32 %42, i32* %10
br label %43
43: ; preds = %37, %31
%44 = load i32, i32* %10
%45 = trunc i32 %44 to i16
%46 = load i16*, i16** %5
%47 = load i32, i32* %9
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i16, i16* %46, i64 %48
store i16 %45, i16* %49
br label %50
50: ; preds = %43
%51 = load i32, i32* %9
%52 = add nsw i32 %51, 1
store i32 %52, i32* %9
br label %18
53: ; preds = %18
ret void
}

LLVM IR (-O2):
define void @dct_unquantize_h263_inter_c(i16* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = add nsw i32 %2, -1
%6 = or i32 %5, 1
%7 = shl i32 %2, 1
%8 = icmp slt i32 %3, 0
br i1 %8, label %86, label %9
9: ; preds = %4
%10 = sub nsw i32 0, %6
%11 = add nuw i32 %3, 1
%12 = zext i32 %11 to i64
%13 = icmp ult i32 %3, 7
br i1 %13, label %72, label %14
14: ; preds = %9
%15 = and i64 %12, 4294967288
%16 = insertelement <8 x i32> poison, i32 %7, i64 0
%17 = shufflevector <8 x i32> %16, <8 x i32> poison, <8 x i32> zeroinitializer
%18 = insertelement <8 x i32> poison, i32 %10, i64 0
%19 = shufflevector <8 x i32> %18, <8 x i32> poison, <8 x i32> zeroinitializer
%20 = insertelement <8 x i32> poison, i32 %6, i64 0
%21 = shufflevector <8 x i32> %20, <8 x i32> poison, <8 x i32> zeroinitializer
%22 = add nsw i64 %15, -8
%23 = lshr exact i64 %22, 3
%24 = add nuw nsw i64 %23, 1
%25 = and i64 %24, 1
%26 = icmp eq i64 %22, 0
br i1 %26, label %56, label %27
27: ; preds = %14
%28 = and i64 %24, 4611686018427387902
br label %29
29: ; preds = %29, %27
%30 = phi i64 [ 0, %27 ], [ %53, %29 ]
%31 = phi i64 [ 0, %27 ], [ %54, %29 ]
%32 = getelementptr inbounds i16, i16* %0, i64 %30
%33 = bitcast i16* %32 to <8 x i16>*
%34 = load <8 x i16>, <8 x i16>* %33
%35 = zext <8 x i16> %34 to <8 x i32>
%36 = icmp slt <8 x i16> %34, zeroinitializer
%37 = mul <8 x i32> %17, %35
%38 = select <8 x i1> %36, <8 x i32> %19, <8 x i32> %21
%39 = add <8 x i32> %37, %38
%40 = trunc <8 x i32> %39 to <8 x i16>
%41 = bitcast i16* %32 to <8 x i16>*
store <8 x i16> %40, <8 x i16>* %41
%42 = or i64 %30, 8
%43 = getelementptr inbounds i16, i16* %0, i64 %42
%44 = bitcast i16* %43 to <8 x i16>*
%45 = load <8 x i16>, <8 x i16>* %44
%46 = zext <8 x i16> %45 to <8 x i32>
%47 = icmp slt <8 x i16> %45, zeroinitializer
%48 = mul <8 x i32> %17, %46
%49 = select <8 x i1> %47, <8 x i32> %19, <8 x i32> %21
%50 = add <8 x i32> %48, %49
%51 = trunc <8 x i32> %50 to <8 x i16>
%52 = bitcast i16* %43 to <8 x i16>*
store <8 x i16> %51, <8 x i16>* %52
%53 = add nuw i64 %30, 16
%54 = add i64 %31, 2
%55 = icmp eq i64 %54, %28
br i1 %55, label %56, label %29
56: ; preds = %29, %14
%57 = phi i64 [ 0, %14 ], [ %53, %29 ]
%58 = icmp eq i64 %25, 0
br i1 %58, label %70, label %59
59: ; preds = %56
%60 = getelementptr inbounds i16, i16* %0, i64 %57
%61 = bitcast i16* %60 to <8 x i16>*
%62 = load <8 x i16>, <8 x i16>* %61
%63 = zext <8 x i16> %62 to <8 x i32>
%64 = icmp slt <8 x i16> %62, zeroinitializer
%65 = mul <8 x i32> %17, %63
%66 = select <8 x i1> %64, <8 x i32> %19, <8 x i32> %21
%67 = add <8 x i32> %65, %66
%68 = trunc <8 x i32> %67 to <8 x i16>
%69 = bitcast i16* %60 to <8 x i16>*
store <8 x i16> %68, <8 x i16>* %69
br label %70
70: ; preds = %56, %59
%71 = icmp eq i64 %15, %12
br i1 %71, label %86, label %72
72: ; preds = %9, %70
%73 = phi i64 [ 0, %9 ], [ %15, %70 ]
br label %74
74: ; preds = %72, %74
%75 = phi i64 [ %84, %74 ], [ %73, %72 ]
%76 = getelementptr inbounds i16, i16* %0, i64 %75
%77 = load i16, i16* %76
%78 = zext i16 %77 to i32
%79 = icmp slt i16 %77, 0
%80 = mul i32 %7, %78
%81 = select i1 %79, i32 %10, i32 %6
%82 = add i32 %80, %81
%83 = trunc i32 %82 to i16
store i16 %83, i16* %76
%84 = add nuw nsw i64 %75, 1
%85 = icmp eq i64 %84, %12
br i1 %85, label %86, label %74
86: ; preds = %74, %70, %4
ret void
}