#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 */
typedef double int16_t;

/* Variables and functions */
double _raised_cosine(double, double, int);
int /*<<< orphan*/ round(double);
size_t _vbidata_init(int16_t *lut, unsigned int swidth, unsigned int dwidth,
                     int16_t level, int filter, double beta) {
  size_t l;
  int b, x, lb;
  l = 0;
  for (lb = b = 0; b < swidth; b++) {
    double tt = (1.0 / swidth) * (0.5 + b);
    for (x = 0; x < dwidth; x++) {
      double tv = (1.0 / dwidth) * (0.5 + x);
      double tr = (tv - tt) * swidth;
      double h = _raised_cosine(tr, beta, 1);
      int16_t w = (int16_t)round(h * level);
      if (w != 0) {
        if (lb != b) {
          if (lut) {
            *(lut++) = b;
            *(lut++) = 0;
          }
          l += sizeof(int16_t) * 2;
          lb = b;
        }
        if (lut) {
          *(lut++) = x;
          *(lut++) = w;
        }
        l += sizeof(int16_t) * 2;
      }
    }
    l += sizeof(int16_t) * 2;
  }
  if (lut) {
    *(lut++) = 0;
    *(lut++) = 0;
  }
  l += sizeof(int16_t) * 2;
  return (l);
}


x86 assembly (clang, -O0):
<_vbidata_init>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movsd  %xmm1,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    1308 <_vbidata_init+0x1e8>
mov    -0xc(%rbp),%eax
cvtsi2sd %rax,%xmm1
movsd  0xe97(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsi2sdl -0x34(%rbp),%xmm2
movsd  0xe7e(%rip),%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x10(%rbp),%eax
jae    12ee <_vbidata_init+0x1ce>
mov    -0x10(%rbp),%eax
cvtsi2sd %rax,%xmm1
movsd  0xe56(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsi2sdl -0x38(%rbp),%xmm1
movsd  0xe3d(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
subsd  %xmm1,%xmm0
mov    -0xc(%rbp),%eax
cvtsi2sd %rax,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
mov    $0x1,%edi
call   1030 <_raised_cosine@plt>
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
call   1040 <round@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    123d <_vbidata_init+0x11d>
jp     123d <_vbidata_init+0x11d>
jmp    12db <_vbidata_init+0x1bb>
mov    -0x3c(%rbp),%eax
cmp    -0x34(%rbp),%eax
je     1294 <_vbidata_init+0x174>
cmpq   $0x0,-0x8(%rbp)
je     1282 <_vbidata_init+0x162>
cvtsi2sdl -0x34(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpq   $0x0,-0x8(%rbp)
je     12cf <_vbidata_init+0x1af>
cvtsi2sdl -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x30(%rbp)
jmp    12e0 <_vbidata_init+0x1c0>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1196 <_vbidata_init+0x76>
mov    -0x30(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1155 <_vbidata_init+0x35>
cmpq   $0x0,-0x8(%rbp)
je     133f <_vbidata_init+0x21f>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_vbidata_init>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
movsd  %xmm1,0x38(%rsp)
movsd  %xmm0,0x30(%rsp)
mov    %rdi,%rbx
test   %esi,%esi
je     12be <_vbidata_init+0x19e>
mov    %edx,%r15d
mov    %esi,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
movsd  0xea6(%rip),%xmm1
movapd %xmm1,%xmm2
movsd  %xmm0,0x28(%rsp)
divsd  %xmm0,%xmm2
movsd  %xmm2,0x10(%rsp)
mov    %edx,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
divsd  %xmm0,%xmm1
movsd  %xmm1,0x20(%rsp)
xor    %eax,%eax
xor    %r14d,%r14d
xor    %r12d,%r12d
mov    %esi,0xc(%rsp)
jmp    11a6 <_vbidata_init+0x86>
mov    %rax,%r13
lea    0x10(%r13),%rax
add    $0x1,%r14d
cmp    0xc(%rsp),%r14d
je     129b <_vbidata_init+0x17b>
xorps  %xmm0,%xmm0
cvtsi2sd %r14d,%xmm0
movsd  %xmm0,0x18(%rsp)
movapd %xmm0,%xmm1
addsd  0xe48(%rip),%xmm1
test   %r15d,%r15d
je     1190 <_vbidata_init+0x70>
mulsd  0x10(%rsp),%xmm1
xor    %ebp,%ebp
mov    %rax,%r13
movsd  %xmm1,(%rsp)
jmp    11ed <_vbidata_init+0xcd>
nopw   0x0(%rax,%rax,1)
movsd  (%rsp),%xmm1
add    $0x1,%ebp
cmp    %ebp,%r15d
je     1193 <_vbidata_init+0x73>
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
movsd  %xmm0,0x40(%rsp)
addsd  0xe06(%rip),%xmm0
mulsd  0x20(%rsp),%xmm0
subsd  %xmm1,%xmm0
mulsd  0x28(%rsp),%xmm0
movsd  0x38(%rsp),%xmm1
mov    $0x1,%edi
call   1030 <_raised_cosine@plt>
mulsd  0x30(%rsp),%xmm0
call   1040 <round@plt>
test   %eax,%eax
je     11e0 <_vbidata_init+0xc0>
cmp    %r14d,%r12d
jne    1260 <_vbidata_init+0x140>
movsd  (%rsp),%xmm1
test   %rbx,%rbx
je     128d <_vbidata_init+0x16d>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0x40(%rsp),%xmm2
movsd  %xmm2,(%rbx)
movsd  %xmm0,0x8(%rbx)
add    $0x10,%rbx
jmp    128f <_vbidata_init+0x16f>
nopl   0x0(%rax)
test   %rbx,%rbx
je     127d <_vbidata_init+0x15d>
movsd  0x18(%rsp),%xmm0
movsd  %xmm0,(%rbx)
movq   $0x0,0x8(%rbx)
add    $0x10,%rbx
jmp    127f <_vbidata_init+0x15f>
xor    %ebx,%ebx
movsd  (%rsp),%xmm1
add    $0x10,%r13
test   %rbx,%rbx
jne    1240 <_vbidata_init+0x120>
xor    %ebx,%ebx
add    $0x10,%r13
mov    %r14d,%r12d
jmp    11e5 <_vbidata_init+0xc5>
add    $0x20,%r13
test   %rbx,%rbx
je     12ac <_vbidata_init+0x18c>
xorpd  %xmm0,%xmm0
movupd %xmm0,(%rbx)
mov    %r13,%rax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x10,%r13d
test   %rbx,%rbx
jne    12a4 <_vbidata_init+0x184>
jmp    12ac <_vbidata_init+0x18c>

LLVM IR (-O0):
define i64 @_vbidata_init(double* %0, i32 %1, i32 %2, double %3, i32 %4, double %5) {
%7 = alloca double*
%8 = alloca i32
%9 = alloca i32
%10 = alloca double
%11 = alloca i32
%12 = alloca double
%13 = alloca i64
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
store double* %0, double** %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store double %3, double* %10
store i32 %4, i32* %11
store double %5, double* %12
store i64 0, i64* %13
store i32 0, i32* %14
store i32 0, i32* %16
br label %22
22: ; preds = %101, %6
%23 = load i32, i32* %14
%24 = load i32, i32* %8
%25 = icmp ult i32 %23, %24
br i1 %25, label %26, label %104
26: ; preds = %22
%27 = load i32, i32* %8
%28 = uitofp i32 %27 to double
%29 = fdiv double 1.000000e+00, %28
%30 = load i32, i32* %14
%31 = sitofp i32 %30 to double
%32 = fadd double 5.000000e-01, %31
%33 = fmul double %29, %32
store double %33, double* %17
store i32 0, i32* %15
br label %34
34: ; preds = %95, %26
%35 = load i32, i32* %15
%36 = load i32, i32* %9
%37 = icmp ult i32 %35, %36
br i1 %37, label %38, label %98
38: ; preds = %34
%39 = load i32, i32* %9
%40 = uitofp i32 %39 to double
%41 = fdiv double 1.000000e+00, %40
%42 = load i32, i32* %15
%43 = sitofp i32 %42 to double
%44 = fadd double 5.000000e-01, %43
%45 = fmul double %41, %44
store double %45, double* %18
%46 = load double, double* %18
%47 = load double, double* %17
%48 = fsub double %46, %47
%49 = load i32, i32* %8
%50 = uitofp i32 %49 to double
%51 = fmul double %48, %50
store double %51, double* %19
%52 = load double, double* %19
%53 = load double, double* %12
%54 = call double @_raised_cosine(double %52, double %53, i32 1)
store double %54, double* %20
%55 = load double, double* %20
%56 = load double, double* %10
%57 = fmul double %55, %56
%58 = call i32 @round(double %57)
%59 = sitofp i32 %58 to double
store double %59, double* %21
%60 = load double, double* %21
%61 = fcmp une double %60, 0.000000e+00
br i1 %61, label %62, label %94
62: ; preds = %38
%63 = load i32, i32* %16
%64 = load i32, i32* %14
%65 = icmp ne i32 %63, %64
br i1 %65, label %66, label %80
66: ; preds = %62
%67 = load double*, double** %7
%68 = icmp ne double* %67, null
br i1 %68, label %69, label %76
69: ; preds = %66
%70 = load i32, i32* %14
%71 = sitofp i32 %70 to double
%72 = load double*, double** %7
%73 = getelementptr inbounds double, double* %72, i32 1
store double* %73, double** %7
store double %71, double* %72
%74 = load double*, double** %7
%75 = getelementptr inbounds double, double* %74, i32 1
store double* %75, double** %7
store double 0.000000e+00, double* %74
br label %76
76: ; preds = %69, %66
%77 = load i64, i64* %13
%78 = add i64 %77, 16
store i64 %78, i64* %13
%79 = load i32, i32* %14
store i32 %79, i32* %16
br label %80
80: ; preds = %76, %62
%81 = load double*, double** %7
%82 = icmp ne double* %81, null
br i1 %82, label %83, label %91
83: ; preds = %80
%84 = load i32, i32* %15
%85 = sitofp i32 %84 to double
%86 = load double*, double** %7
%87 = getelementptr inbounds double, double* %86, i32 1
store double* %87, double** %7
store double %85, double* %86
%88 = load double, double* %21
%89 = load double*, double** %7
%90 = getelementptr inbounds double, double* %89, i32 1
store double* %90, double** %7
store double %88, double* %89
br label %91
91: ; preds = %83, %80
%92 = load i64, i64* %13
%93 = add i64 %92, 16
store i64 %93, i64* %13
br label %94
94: ; preds = %91, %38
br label %95
95: ; preds = %94
%96 = load i32, i32* %15
%97 = add nsw i32 %96, 1
store i32 %97, i32* %15
br label %34
98: ; preds = %34
%99 = load i64, i64* %13
%100 = add i64 %99, 16
store i64 %100, i64* %13
br label %101
101: ; preds = %98
%102 = load i32, i32* %14
%103 = add nsw i32 %102, 1
store i32 %103, i32* %14
br label %22
104: ; preds = %22
%105 = load double*, double** %7
%106 = icmp ne double* %105, null
br i1 %106, label %107, label %112
107: ; preds = %104
%108 = load double*, double** %7
%109 = getelementptr inbounds double, double* %108, i32 1
store double* %109, double** %7
store double 0.000000e+00, double* %108
%110 = load double*, double** %7
%111 = getelementptr inbounds double, double* %110, i32 1
store double* %111, double** %7
store double 0.000000e+00, double* %110
br label %112
112: ; preds = %107, %104
%113 = load i64, i64* %13
%114 = add i64 %113, 16
store i64 %114, i64* %13
%115 = load i64, i64* %13
ret i64 %115
}

LLVM IR (-O2):
define i64 @_vbidata_init(double* writeonly %0, i32 %1, i32 %2, double %3, i32 %4, double %5) {
%7 = icmp eq i32 %1, 0
br i1 %7, label %72, label %8
8: ; preds = %6
%9 = uitofp i32 %1 to double
%10 = fdiv double 1.000000e+00, %9
%11 = icmp eq i32 %2, 0
%12 = uitofp i32 %2 to double
%13 = fdiv double 1.000000e+00, %12
br label %14
14: ; preds = %8, %63
%15 = phi double* [ %0, %8 ], [ %66, %63 ]
%16 = phi i64 [ 0, %8 ], [ %67, %63 ]
%17 = phi i32 [ 0, %8 ], [ %68, %63 ]
%18 = phi i32 [ 0, %8 ], [ %64, %63 ]
%19 = sitofp i32 %17 to double
%20 = fadd double %19, 5.000000e-01
%21 = fmul double %10, %20
br i1 %11, label %63, label %22
22: ; preds = %14, %57
%23 = phi double* [ %60, %57 ], [ %15, %14 ]
%24 = phi i64 [ %59, %57 ], [ %16, %14 ]
%25 = phi i32 [ %61, %57 ], [ 0, %14 ]
%26 = phi i32 [ %58, %57 ], [ %18, %14 ]
%27 = sitofp i32 %25 to double
%28 = fadd double %27, 5.000000e-01
%29 = fmul double %13, %28
%30 = fsub double %29, %21
%31 = fmul double %30, %9
%32 = tail call double @_raised_cosine(double %31, double %5, i32 1)
%33 = fmul double %32, %3
%34 = tail call i32 @round(double %33)
%35 = sitofp i32 %34 to double
%36 = icmp eq i32 %34, 0
br i1 %36, label %57, label %37
37: ; preds = %22
%38 = icmp eq i32 %26, %17
br i1 %38, label %47, label %39
39: ; preds = %37
%40 = icmp eq double* %23, null
br i1 %40, label %44, label %41
41: ; preds = %39
%42 = getelementptr inbounds double, double* %23, i64 1
store double %19, double* %23
%43 = getelementptr inbounds double, double* %23, i64 2
store double 0.000000e+00, double* %42
br label %44
44: ; preds = %41, %39
%45 = phi double* [ %43, %41 ], [ null, %39 ]
%46 = add i64 %24, 16
br label %47
47: ; preds = %44, %37
%48 = phi i64 [ %46, %44 ], [ %24, %37 ]
%49 = phi double* [ %45, %44 ], [ %23, %37 ]
%50 = icmp eq double* %49, null
br i1 %50, label %54, label %51
51: ; preds = %47
%52 = getelementptr inbounds double, double* %49, i64 1
store double %27, double* %49
%53 = getelementptr inbounds double, double* %49, i64 2
store double %35, double* %52
br label %54
54: ; preds = %51, %47
%55 = phi double* [ %53, %51 ], [ null, %47 ]
%56 = add i64 %48, 16
br label %57
57: ; preds = %54, %22
%58 = phi i32 [ %17, %54 ], [ %26, %22 ]
%59 = phi i64 [ %56, %54 ], [ %24, %22 ]
%60 = phi double* [ %55, %54 ], [ %23, %22 ]
%61 = add nuw i32 %25, 1
%62 = icmp eq i32 %61, %2
br i1 %62, label %63, label %22
63: ; preds = %57, %14
%64 = phi i32 [ %18, %14 ], [ %58, %57 ]
%65 = phi i64 [ %16, %14 ], [ %59, %57 ]
%66 = phi double* [ %15, %14 ], [ %60, %57 ]
%67 = add i64 %65, 16
%68 = add nuw i32 %17, 1
%69 = icmp eq i32 %68, %1
br i1 %69, label %70, label %14
70: ; preds = %63
%71 = add i64 %65, 32
br label %72
72: ; preds = %70, %6
%73 = phi i64 [ 16, %6 ], [ %71, %70 ]
%74 = phi double* [ %0, %6 ], [ %66, %70 ]
%75 = icmp eq double* %74, null
br i1 %75, label %78, label %76
76: ; preds = %72
%77 = bitcast double* %74 to i8*
br label %78
78: ; preds = %76, %72
ret i64 %73
}