#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 */
double _J_0();
double _J_10(double const, double const *);
double _J_11(double const, double const *);
double _J_12(double const, double const *);
double _J_13(double const, double const *);
double _J_20(double const, double const *);
double _J_21(double const, double const *);
double _J_22(double const, double const *);
double _J_23(double const, double const *);
double _J_30(double const, double const *);
double _J_31(double const, double const *);
double _J_32(double const, double const *);
double _J_33(double const, double const *);
double _J_4();
double _J(const long i, const long ci, const double omega,
          const double vertices_omegas[4]) {
  switch (i) {
  case 0:
    return _J_0();
  case 1:
    switch (ci) {
    case 0:
      return _J_10(omega, vertices_omegas);
    case 1:
      return _J_11(omega, vertices_omegas);
    case 2:
      return _J_12(omega, vertices_omegas);
    case 3:
      return _J_13(omega, vertices_omegas);
    }
  case 2:
    switch (ci) {
    case 0:
      return _J_20(omega, vertices_omegas);
    case 1:
      return _J_21(omega, vertices_omegas);
    case 2:
      return _J_22(omega, vertices_omegas);
    case 3:
      return _J_23(omega, vertices_omegas);
    }
  case 3:
    switch (ci) {
    case 0:
      return _J_30(omega, vertices_omegas);
    case 1:
      return _J_31(omega, vertices_omegas);
    case 2:
      return _J_32(omega, vertices_omegas);
    case 3:
      return _J_33(omega, vertices_omegas);
    }
  case 4:
    return _J_4();
  };
  ;
  ;
  ;
  return 0;
}


x86 assembly (clang, -O0):
<_J>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
sub    $0x4,%rax
ja     13e2 <_J+0x202>
mov    -0x30(%rbp),%rax
lea    0xdea(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    $0x0,%al
call   1050 <_J_0@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
sub    $0x3,%rax
ja     12b6 <_J+0xd6>
mov    -0x38(%rbp),%rax
lea    0xdc7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   10e0 <_J_10@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   1080 <_J_11@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   10d0 <_J_12@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   1070 <_J_13@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
jmp    12bb <_J+0xdb>
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
sub    $0x3,%rax
ja     1341 <_J+0x161>
mov    -0x40(%rbp),%rax
lea    0xd4c(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   1100 <_J_20@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   10a0 <_J_21@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   10f0 <_J_22@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   1090 <_J_23@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
jmp    1346 <_J+0x166>
mov    -0x18(%rbp),%rax
mov    %rax,-0x48(%rbp)
sub    $0x3,%rax
ja     13cc <_J+0x1ec>
mov    -0x48(%rbp),%rax
lea    0xcd1(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   10c0 <_J_30@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   1040 <_J_31@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   10b0 <_J_32@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
movsd  -0x20(%rbp),%xmm0
mov    -0x28(%rbp),%rdi
call   1060 <_J_33@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
jmp    13d1 <_J+0x1f1>
mov    $0x0,%al
call   1030 <_J_4@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13ea <_J+0x20a>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_J>:
cmp    $0x4,%rdi
ja     121b <_J+0x3b>
lea    0xe13(%rip),%rax
movslq (%rax,%rdi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
xor    %eax,%eax
jmp    1050 <_J_0@plt>
cmp    $0x3,%rsi
ja     125b <_J+0x7b>
lea    0xe0a(%rip),%rax
movslq (%rax,%rsi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    %rdx,%rdi
jmp    10c0 <_J_30@plt>
xorps  %xmm0,%xmm0
ret
cmp    $0x3,%rsi
ja     125b <_J+0x7b>
lea    0xe08(%rip),%rax
movslq (%rax,%rsi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    %rdx,%rdi
jmp    10e0 <_J_10@plt>
cmp    $0x3,%rsi
ja     125b <_J+0x7b>
lea    0xdda(%rip),%rax
movslq (%rax,%rsi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
mov    %rdx,%rdi
jmp    1100 <_J_20@plt>
xor    %eax,%eax
jmp    1030 <_J_4@plt>
mov    %rdx,%rdi
jmp    1040 <_J_31@plt>
mov    %rdx,%rdi
jmp    10b0 <_J_32@plt>
mov    %rdx,%rdi
jmp    1060 <_J_33@plt>
mov    %rdx,%rdi
jmp    1080 <_J_11@plt>
mov    %rdx,%rdi
jmp    10d0 <_J_12@plt>
mov    %rdx,%rdi
jmp    1070 <_J_13@plt>
mov    %rdx,%rdi
jmp    10a0 <_J_21@plt>
mov    %rdx,%rdi
jmp    10f0 <_J_22@plt>
mov    %rdx,%rdi
jmp    1090 <_J_23@plt>

LLVM IR (-O0):
define double @_J(i64 %0, i64 %1, double %2, double* %3) {
%5 = alloca double
%6 = alloca i64
%7 = alloca i64
%8 = alloca double
%9 = alloca double*
store i64 %0, i64* %6
store i64 %1, i64* %7
store double %2, double* %8
store double* %3, double** %9
%10 = load i64, i64* %6
switch i64 %10, label %72 [
i64 0, label %11
i64 1, label %13
i64 2, label %32
i64 3, label %51
i64 4, label %70
]
11: ; preds = %4
%12 = call double (...) @_J_0()
store double %12, double* %5
br label %73
13: ; preds = %4
%14 = load i64, i64* %7
switch i64 %14, label %31 [
i64 0, label %15
i64 1, label %19
i64 2, label %23
i64 3, label %27
]
15: ; preds = %13
%16 = load double, double* %8
%17 = load double*, double** %9
%18 = call double @_J_10(double %16, double* %17)
store double %18, double* %5
br label %73
19: ; preds = %13
%20 = load double, double* %8
%21 = load double*, double** %9
%22 = call double @_J_11(double %20, double* %21)
store double %22, double* %5
br label %73
23: ; preds = %13
%24 = load double, double* %8
%25 = load double*, double** %9
%26 = call double @_J_12(double %24, double* %25)
store double %26, double* %5
br label %73
27: ; preds = %13
%28 = load double, double* %8
%29 = load double*, double** %9
%30 = call double @_J_13(double %28, double* %29)
store double %30, double* %5
br label %73
31: ; preds = %13
br label %32
32: ; preds = %4, %31
%33 = load i64, i64* %7
switch i64 %33, label %50 [
i64 0, label %34
i64 1, label %38
i64 2, label %42
i64 3, label %46
]
34: ; preds = %32
%35 = load double, double* %8
%36 = load double*, double** %9
%37 = call double @_J_20(double %35, double* %36)
store double %37, double* %5
br label %73
38: ; preds = %32
%39 = load double, double* %8
%40 = load double*, double** %9
%41 = call double @_J_21(double %39, double* %40)
store double %41, double* %5
br label %73
42: ; preds = %32
%43 = load double, double* %8
%44 = load double*, double** %9
%45 = call double @_J_22(double %43, double* %44)
store double %45, double* %5
br label %73
46: ; preds = %32
%47 = load double, double* %8
%48 = load double*, double** %9
%49 = call double @_J_23(double %47, double* %48)
store double %49, double* %5
br label %73
50: ; preds = %32
br label %51
51: ; preds = %4, %50
%52 = load i64, i64* %7
switch i64 %52, label %69 [
i64 0, label %53
i64 1, label %57
i64 2, label %61
i64 3, label %65
]
53: ; preds = %51
%54 = load double, double* %8
%55 = load double*, double** %9
%56 = call double @_J_30(double %54, double* %55)
store double %56, double* %5
br label %73
57: ; preds = %51
%58 = load double, double* %8
%59 = load double*, double** %9
%60 = call double @_J_31(double %58, double* %59)
store double %60, double* %5
br label %73
61: ; preds = %51
%62 = load double, double* %8
%63 = load double*, double** %9
%64 = call double @_J_32(double %62, double* %63)
store double %64, double* %5
br label %73
65: ; preds = %51
%66 = load double, double* %8
%67 = load double*, double** %9
%68 = call double @_J_33(double %66, double* %67)
store double %68, double* %5
br label %73
69: ; preds = %51
br label %70
70: ; preds = %4, %69
%71 = call double (...) @_J_4()
store double %71, double* %5
br label %73
72: ; preds = %4
store double 0.000000e+00, double* %5
br label %73
73: ; preds = %72, %70, %65, %61, %57, %53, %46, %42, %38, %34, %27, %23, %19, %15, %11
%74 = load double, double* %5
ret double %74
}

LLVM IR (-O2):
define double @_J(i64 %0, i64 %1, double %2, double* %3) {
switch i64 %0, label %36 [
i64 0, label %5
i64 1, label %7
i64 2, label %16
i64 3, label %25
i64 4, label %34
]
5: ; preds = %4
%6 = tail call double (...) @_J_0()
br label %36
7: ; preds = %4
switch i64 %1, label %34 [
i64 0, label %8
i64 1, label %10
i64 2, label %12
i64 3, label %14
]
8: ; preds = %7
%9 = tail call double @_J_10(double %2, double* %3)
br label %36
10: ; preds = %7
%11 = tail call double @_J_11(double %2, double* %3)
br label %36
12: ; preds = %7
%13 = tail call double @_J_12(double %2, double* %3)
br label %36
14: ; preds = %7
%15 = tail call double @_J_13(double %2, double* %3)
br label %36
16: ; preds = %4
switch i64 %1, label %34 [
i64 0, label %17
i64 1, label %19
i64 2, label %21
i64 3, label %23
]
17: ; preds = %16
%18 = tail call double @_J_20(double %2, double* %3)
br label %36
19: ; preds = %16
%20 = tail call double @_J_21(double %2, double* %3)
br label %36
21: ; preds = %16
%22 = tail call double @_J_22(double %2, double* %3)
br label %36
23: ; preds = %16
%24 = tail call double @_J_23(double %2, double* %3)
br label %36
25: ; preds = %4
switch i64 %1, label %34 [
i64 0, label %26
i64 1, label %28
i64 2, label %30
i64 3, label %32
]
26: ; preds = %25
%27 = tail call double @_J_30(double %2, double* %3)
br label %36
28: ; preds = %25
%29 = tail call double @_J_31(double %2, double* %3)
br label %36
30: ; preds = %25
%31 = tail call double @_J_32(double %2, double* %3)
br label %36
32: ; preds = %25
%33 = tail call double @_J_33(double %2, double* %3)
br label %36
34: ; preds = %7, %16, %25, %4
%35 = tail call double (...) @_J_4()
br label %36
36: ; preds = %4, %34, %32, %30, %28, %26, %23, %21, %19, %17, %14, %12, %10, %8, %5
%37 = phi double [ %35, %34 ], [ %33, %32 ], [ %31, %30 ], [ %29, %28 ], [ %27, %26 ], [ %24, %23 ], [ %22, %21 ], [ %20, %19 ], [ %18, %17 ], [ %15, %14 ], [ %13, %12 ], [ %11, %10 ], [ %9, %8 ], [ %6, %5 ], [ 0.000000e+00, %4 ]
ret double %37
}