void arith(char o, double *r, double *h) {
  int t, ex;
  int a, b;
  switch (o) {
  case '@':
    if ((*r == 1) && (*h == 1)) {
      *r = 1;
    } else {
      *r = 0;
    };
    break;
  case '$':
    if ((*r == 1) || (*h == 1)) {
      *r = 1;
    } else {
      *r = 0;
    };
    break;
  case '!':
    *r = (*r != *h);
    break;
  case ':':
    *r = (*r >= *h);
    break;
  case '_':
    *r = (*r <= *h);
    break;
  case '~':
    *r = (*r == *h);
    break;
  case '>':
    *r = (*r > *h);
    break;
  case '<':
    *r = (*r < *h);
    break;
  case '-':
    *r = *r - *h;
    break;
  case '+':
    *r = *r + *h;
    break;
  case '*':
    *r = *r * *h;
    break;
  case '/':
    *r = (*r) / (*h);
    break;
  case '%':
    t = (*r) / (*h);
    *r = *r - (t * (*h));
    break;
  case '|':
    a = (int)*r;
    b = (int)*h;
    *r = 1.0 * (a | b);
    break;
  case '&':
    a = (int)*r;
    b = (int)*h;
    *r = 1.0 * (a & b);
    break;
  case '^':
    ex = *r;
    if (*h == 0) {
      *r = 1;
      break;
    }
    for (t = *h - 1; t > 0; --t)
      *r = (*r) * ex;
    break;
  }
}


x86 assembly (clang, -O0):
<arith>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsbl -0x1(%rbp),%eax
add    $0xffffffdf,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x5d,%eax
ja     14dd <arith+0x3dd>
mov    -0x30(%rbp),%rax
lea    0xed5(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xeb4(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1191 <arith+0x91>
jp     1191 <arith+0x91>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xe94(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1191 <arith+0x91>
jp     1191 <arith+0x91>
mov    -0x10(%rbp),%rax
movsd  0xe78(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    119c <arith+0x9c>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xe4f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11c6 <arith+0xc6>
jp     11c6 <arith+0xc6>
jmp    11e6 <arith+0xe6>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xe2a(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11fb <arith+0xfb>
jp     11fb <arith+0xfb>
mov    -0x10(%rbp),%rax
movsd  0xe0e(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    1206 <arith+0x106>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
ucomisd (%rax),%xmm0
setne  %al
setp   %cl
or     %cl,%al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
ucomisd (%rax),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
ucomisd (%rax),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
ucomisd (%rax),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
cvtsi2sd %eax,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
subsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
addsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
divsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
divsd  (%rax),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
cvtsi2sdl -0x1c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
or     -0x28(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xbf9(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
and    -0x28(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xbc0(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x10(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    148c <arith+0x38c>
jp     148c <arith+0x38c>
mov    -0x10(%rbp),%rax
movsd  0xb7d(%rip),%xmm0
movsd  %xmm0,(%rax)
jmp    14dd <arith+0x3dd>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xb64(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jle    14d8 <arith+0x3d8>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
cvtsi2sdl -0x20(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
jmp    14a7 <arith+0x3a7>
jmp    14dd <arith+0x3dd>
pop    %rbp
ret

x86 assembly (clang, -O2):
<arith>:
add    $0xffffffdf,%edi
cmp    $0x5d,%edi
ja     1250 <arith+0x150>
lea    0xefd(%rip),%rax
movslq (%rax,%rdi,4),%rcx
add    %rax,%rcx
jmp    *%rcx
movsd  (%rdx),%xmm1
cmpneqsd (%rsi),%xmm1
jmp    1240 <arith+0x140>
movsd  (%rsi),%xmm1
movsd  0xeca(%rip),%xmm0
ucomisd %xmm0,%xmm1
jne    11e8 <arith+0xe8>
jnp    124c <arith+0x14c>
jmp    11e8 <arith+0xe8>
movsd  (%rsi),%xmm0
movsd  (%rdx),%xmm1
movapd %xmm0,%xmm2
divsd  %xmm1,%xmm2
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
jmp    124c <arith+0x14c>
cvttsd2si (%rsi),%eax
cvttsd2si (%rdx),%ecx
and    %eax,%ecx
cvtsi2sd %ecx,%xmm0
jmp    124c <arith+0x14c>
movsd  (%rsi),%xmm0
mulsd  (%rdx),%xmm0
jmp    124c <arith+0x14c>
movsd  (%rsi),%xmm0
addsd  (%rdx),%xmm0
jmp    124c <arith+0x14c>
movsd  (%rsi),%xmm0
subsd  (%rdx),%xmm0
jmp    124c <arith+0x14c>
movsd  (%rsi),%xmm0
divsd  (%rdx),%xmm0
jmp    124c <arith+0x14c>
movsd  (%rdx),%xmm1
cmplesd (%rsi),%xmm1
jmp    1240 <arith+0x140>
movsd  (%rsi),%xmm1
cmpltsd (%rdx),%xmm1
jmp    1240 <arith+0x140>
movsd  (%rdx),%xmm1
cmpltsd (%rsi),%xmm1
jmp    1240 <arith+0x140>
movsd  (%rsi),%xmm0
ucomisd 0xe1c(%rip),%xmm0
jne    11fc <arith+0xfc>
jp     11fc <arith+0xfc>
movsd  (%rdx),%xmm1
movsd  0xe0c(%rip),%xmm0
ucomisd %xmm0,%xmm1
jne    11fc <arith+0xfc>
jnp    124c <arith+0x14c>
xorpd  %xmm0,%xmm0
jmp    124c <arith+0x14c>
movsd  (%rdx),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1251 <arith+0x151>
jp     1251 <arith+0x151>
movsd  0xde6(%rip),%xmm0
jmp    124c <arith+0x14c>
movsd  (%rsi),%xmm1
cmplesd (%rdx),%xmm1
jmp    1240 <arith+0x140>
cvttsd2si (%rsi),%eax
cvttsd2si (%rdx),%ecx
or     %eax,%ecx
cvtsi2sd %ecx,%xmm0
jmp    124c <arith+0x14c>
movsd  (%rdx),%xmm1
cmpeqsd (%rsi),%xmm1
movsd  0xdb8(%rip),%xmm0
andpd  %xmm1,%xmm0
movsd  %xmm0,(%rsi)
ret
addsd  0xdaf(%rip),%xmm0
cvttsd2si %xmm0,%eax
test   %eax,%eax
jle    1250 <arith+0x150>
movsd  (%rsi),%xmm0
cvttsd2si %xmm0,%ecx
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
lea    -0x1(%rax),%ecx
mov    %eax,%edx
and    $0x7,%edx
je     128d <arith+0x18d>
xor    %edi,%edi
nopl   0x0(%rax)
mulsd  %xmm1,%xmm0
add    $0x1,%edi
cmp    %edi,%edx
jne    1280 <arith+0x180>
sub    %edi,%eax
cmp    $0x7,%ecx
jb     124c <arith+0x14c>
add    $0xffffffff,%eax
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0xfffffff8,%eax
cmp    $0xfffffffe,%eax
jb     12a0 <arith+0x1a0>
jmp    124c <arith+0x14c>

LLVM IR (-O0):
define void @arith(i8 signext %0, double* %1, double* %2) {
%4 = alloca i8
%5 = alloca double*
%6 = alloca double*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i8 %0, i8* %4
store double* %1, double** %5
store double* %2, double** %6
%11 = load i8, i8* %4
%12 = sext i8 %11 to i32
switch i32 %12, label %191 [
i32 64, label %13
i32 36, label %26
i32 33, label %39
i32 58, label %48
i32 95, label %57
i32 126, label %66
i32 62, label %75
i32 60, label %84
i32 45, label %93
i32 43, label %100
i32 42, label %107
i32 47, label %114
i32 37, label %121
i32 124, label %137
i32 38, label %150
i32 94, label %163
]
13: ; preds = %3
%14 = load double*, double** %5
%15 = load double, double* %14
%16 = fcmp oeq double %15, 1.000000e+00
br i1 %16, label %17, label %23
17: ; preds = %13
%18 = load double*, double** %6
%19 = load double, double* %18
%20 = fcmp oeq double %19, 1.000000e+00
br i1 %20, label %21, label %23
21: ; preds = %17
%22 = load double*, double** %5
store double 1.000000e+00, double* %22
br label %25
23: ; preds = %17, %13
%24 = load double*, double** %5
store double 0.000000e+00, double* %24
br label %25
25: ; preds = %23, %21
br label %191
26: ; preds = %3
%27 = load double*, double** %5
%28 = load double, double* %27
%29 = fcmp oeq double %28, 1.000000e+00
br i1 %29, label %34, label %30
30: ; preds = %26
%31 = load double*, double** %6
%32 = load double, double* %31
%33 = fcmp oeq double %32, 1.000000e+00
br i1 %33, label %34, label %36
34: ; preds = %30, %26
%35 = load double*, double** %5
store double 1.000000e+00, double* %35
br label %38
36: ; preds = %30
%37 = load double*, double** %5
store double 0.000000e+00, double* %37
br label %38
38: ; preds = %36, %34
br label %191
39: ; preds = %3
%40 = load double*, double** %5
%41 = load double, double* %40
%42 = load double*, double** %6
%43 = load double, double* %42
%44 = fcmp une double %41, %43
%45 = zext i1 %44 to i32
%46 = sitofp i32 %45 to double
%47 = load double*, double** %5
store double %46, double* %47
br label %191
48: ; preds = %3
%49 = load double*, double** %5
%50 = load double, double* %49
%51 = load double*, double** %6
%52 = load double, double* %51
%53 = fcmp oge double %50, %52
%54 = zext i1 %53 to i32
%55 = sitofp i32 %54 to double
%56 = load double*, double** %5
store double %55, double* %56
br label %191
57: ; preds = %3
%58 = load double*, double** %5
%59 = load double, double* %58
%60 = load double*, double** %6
%61 = load double, double* %60
%62 = fcmp ole double %59, %61
%63 = zext i1 %62 to i32
%64 = sitofp i32 %63 to double
%65 = load double*, double** %5
store double %64, double* %65
br label %191
66: ; preds = %3
%67 = load double*, double** %5
%68 = load double, double* %67
%69 = load double*, double** %6
%70 = load double, double* %69
%71 = fcmp oeq double %68, %70
%72 = zext i1 %71 to i32
%73 = sitofp i32 %72 to double
%74 = load double*, double** %5
store double %73, double* %74
br label %191
75: ; preds = %3
%76 = load double*, double** %5
%77 = load double, double* %76
%78 = load double*, double** %6
%79 = load double, double* %78
%80 = fcmp ogt double %77, %79
%81 = zext i1 %80 to i32
%82 = sitofp i32 %81 to double
%83 = load double*, double** %5
store double %82, double* %83
br label %191
84: ; preds = %3
%85 = load double*, double** %5
%86 = load double, double* %85
%87 = load double*, double** %6
%88 = load double, double* %87
%89 = fcmp olt double %86, %88
%90 = zext i1 %89 to i32
%91 = sitofp i32 %90 to double
%92 = load double*, double** %5
store double %91, double* %92
br label %191
93: ; preds = %3
%94 = load double*, double** %5
%95 = load double, double* %94
%96 = load double*, double** %6
%97 = load double, double* %96
%98 = fsub double %95, %97
%99 = load double*, double** %5
store double %98, double* %99
br label %191
100: ; preds = %3
%101 = load double*, double** %5
%102 = load double, double* %101
%103 = load double*, double** %6
%104 = load double, double* %103
%105 = fadd double %102, %104
%106 = load double*, double** %5
store double %105, double* %106
br label %191
107: ; preds = %3
%108 = load double*, double** %5
%109 = load double, double* %108
%110 = load double*, double** %6
%111 = load double, double* %110
%112 = fmul double %109, %111
%113 = load double*, double** %5
store double %112, double* %113
br label %191
114: ; preds = %3
%115 = load double*, double** %5
%116 = load double, double* %115
%117 = load double*, double** %6
%118 = load double, double* %117
%119 = fdiv double %116, %118
%120 = load double*, double** %5
store double %119, double* %120
br label %191
121: ; preds = %3
%122 = load double*, double** %5
%123 = load double, double* %122
%124 = load double*, double** %6
%125 = load double, double* %124
%126 = fdiv double %123, %125
%127 = fptosi double %126 to i32
store i32 %127, i32* %7
%128 = load double*, double** %5
%129 = load double, double* %128
%130 = load i32, i32* %7
%131 = sitofp i32 %130 to double
%132 = load double*, double** %6
%133 = load double, double* %132
%134 = fneg double %131
%135 = call double @llvm.fmuladd.f64(double %134, double %133, double %129)
%136 = load double*, double** %5
store double %135, double* %136
br label %191
137: ; preds = %3
%138 = load double*, double** %5
%139 = load double, double* %138
%140 = fptosi double %139 to i32
store i32 %140, i32* %9
%141 = load double*, double** %6
%142 = load double, double* %141
%143 = fptosi double %142 to i32
store i32 %143, i32* %10
%144 = load i32, i32* %9
%145 = load i32, i32* %10
%146 = or i32 %144, %145
%147 = sitofp i32 %146 to double
%148 = fmul double 1.000000e+00, %147
%149 = load double*, double** %5
store double %148, double* %149
br label %191
150: ; preds = %3
%151 = load double*, double** %5
%152 = load double, double* %151
%153 = fptosi double %152 to i32
store i32 %153, i32* %9
%154 = load double*, double** %6
%155 = load double, double* %154
%156 = fptosi double %155 to i32
store i32 %156, i32* %10
%157 = load i32, i32* %9
%158 = load i32, i32* %10
%159 = and i32 %157, %158
%160 = sitofp i32 %159 to double
%161 = fmul double 1.000000e+00, %160
%162 = load double*, double** %5
store double %161, double* %162
br label %191
163: ; preds = %3
%164 = load double*, double** %5
%165 = load double, double* %164
%166 = fptosi double %165 to i32
store i32 %166, i32* %8
%167 = load double*, double** %6
%168 = load double, double* %167
%169 = fcmp oeq double %168, 0.000000e+00
br i1 %169, label %170, label %172
170: ; preds = %163
%171 = load double*, double** %5
store double 1.000000e+00, double* %171
br label %191
172: ; preds = %163
%173 = load double*, double** %6
%174 = load double, double* %173
%175 = fsub double %174, 1.000000e+00
%176 = fptosi double %175 to i32
store i32 %176, i32* %7
br label %177
177: ; preds = %187, %172
%178 = load i32, i32* %7
%179 = icmp sgt i32 %178, 0
br i1 %179, label %180, label %190
180: ; preds = %177
%181 = load double*, double** %5
%182 = load double, double* %181
%183 = load i32, i32* %8
%184 = sitofp i32 %183 to double
%185 = fmul double %182, %184
%186 = load double*, double** %5
store double %185, double* %186
br label %187
187: ; preds = %180
%188 = load i32, i32* %7
%189 = add nsw i32 %188, -1
store i32 %189, i32* %7
br label %177
190: ; preds = %177
br label %191
191: ; preds = %3, %190, %170, %150, %137, %121, %114, %107, %100, %93, %84, %75, %66, %57, %48, %39, %38, %25
ret void
}

LLVM IR (-O2):
define void @arith(i8 signext %0, double* %1, double* nocapture %2) {
%4 = sext i8 %0 to i32
switch i32 %4, label %130 [
i32 64, label %5
i32 36, label %12
i32 33, label %19
i32 58, label %24
i32 95, label %29
i32 126, label %34
i32 62, label %39
i32 60, label %44
i32 45, label %49
i32 43, label %53
i32 42, label %57
i32 47, label %61
i32 37, label %65
i32 124, label %73
i32 38, label %80
i32 94, label %87
]
5: ; preds = %3
%6 = load double, double* %1
%7 = fcmp oeq double %6, 1.000000e+00
br i1 %7, label %8, label %11
8: ; preds = %5
%9 = load double, double* %2
%10 = fcmp oeq double %9, 1.000000e+00
br i1 %10, label %128, label %11
11: ; preds = %8, %5
br label %128
12: ; preds = %3
%13 = load double, double* %1
%14 = fcmp oeq double %13, 1.000000e+00
br i1 %14, label %128, label %15
15: ; preds = %12
%16 = load double, double* %2
%17 = fcmp oeq double %16, 1.000000e+00
br i1 %17, label %128, label %18
18: ; preds = %15
br label %128
19: ; preds = %3
%20 = load double, double* %1
%21 = load double, double* %2
%22 = fcmp une double %20, %21
%23 = uitofp i1 %22 to double
br label %128
24: ; preds = %3
%25 = load double, double* %1
%26 = load double, double* %2
%27 = fcmp oge double %25, %26
%28 = uitofp i1 %27 to double
br label %128
29: ; preds = %3
%30 = load double, double* %1
%31 = load double, double* %2
%32 = fcmp ole double %30, %31
%33 = uitofp i1 %32 to double
br label %128
34: ; preds = %3
%35 = load double, double* %1
%36 = load double, double* %2
%37 = fcmp oeq double %35, %36
%38 = uitofp i1 %37 to double
br label %128
39: ; preds = %3
%40 = load double, double* %1
%41 = load double, double* %2
%42 = fcmp ogt double %40, %41
%43 = uitofp i1 %42 to double
br label %128
44: ; preds = %3
%45 = load double, double* %1
%46 = load double, double* %2
%47 = fcmp olt double %45, %46
%48 = uitofp i1 %47 to double
br label %128
49: ; preds = %3
%50 = load double, double* %1
%51 = load double, double* %2
%52 = fsub double %50, %51
br label %128
53: ; preds = %3
%54 = load double, double* %1
%55 = load double, double* %2
%56 = fadd double %54, %55
br label %128
57: ; preds = %3
%58 = load double, double* %1
%59 = load double, double* %2
%60 = fmul double %58, %59
br label %128
61: ; preds = %3
%62 = load double, double* %1
%63 = load double, double* %2
%64 = fdiv double %62, %63
br label %128
65: ; preds = %3
%66 = load double, double* %1
%67 = load double, double* %2
%68 = fdiv double %66, %67
%69 = fptosi double %68 to i32
%70 = sitofp i32 %69 to double
%71 = fneg double %70
%72 = tail call double @llvm.fmuladd.f64(double %71, double %67, double %66)
br label %128
73: ; preds = %3
%74 = load double, double* %1
%75 = fptosi double %74 to i32
%76 = load double, double* %2
%77 = fptosi double %76 to i32
%78 = or i32 %77, %75
%79 = sitofp i32 %78 to double
br label %128
80: ; preds = %3
%81 = load double, double* %1
%82 = fptosi double %81 to i32
%83 = load double, double* %2
%84 = fptosi double %83 to i32
%85 = and i32 %84, %82
%86 = sitofp i32 %85 to double
br label %128
87: ; preds = %3
%88 = load double, double* %1
%89 = fptosi double %88 to i32
%90 = load double, double* %2
%91 = fcmp oeq double %90, 0.000000e+00
br i1 %91, label %128, label %92
92: ; preds = %87
%93 = fadd double %90, -1.000000e+00
%94 = fptosi double %93 to i32
%95 = icmp sgt i32 %94, 0
br i1 %95, label %96, label %130
96: ; preds = %92
%97 = sitofp i32 %89 to double
%98 = add i32 %94, -1
%99 = and i32 %94, 7
%100 = icmp eq i32 %99, 0
br i1 %100, label %109, label %101
101: ; preds = %96, %101
%102 = phi double [ %105, %101 ], [ %88, %96 ]
%103 = phi i32 [ %106, %101 ], [ %94, %96 ]
%104 = phi i32 [ %107, %101 ], [ 0, %96 ]
%105 = fmul double %102, %97
%106 = add nsw i32 %103, -1
%107 = add i32 %104, 1
%108 = icmp eq i32 %107, %99
br i1 %108, label %109, label %101
109: ; preds = %101, %96
%110 = phi double [ %88, %96 ], [ %105, %101 ]
%111 = phi i32 [ %94, %96 ], [ %106, %101 ]
%112 = phi double [ undef, %96 ], [ %105, %101 ]
%113 = icmp ult i32 %98, 7
br i1 %113, label %128, label %114
114: ; preds = %109, %114
%115 = phi double [ %124, %114 ], [ %110, %109 ]
%116 = phi i32 [ %125, %114 ], [ %111, %109 ]
%117 = fmul double %115, %97
%118 = fmul double %117, %97
%119 = fmul double %118, %97
%120 = fmul double %119, %97
%121 = fmul double %120, %97
%122 = fmul double %121, %97
%123 = fmul double %122, %97
%124 = fmul double %123, %97
%125 = add nsw i32 %116, -8
%126 = add i32 %116, -9
%127 = icmp ult i32 %126, -2
br i1 %127, label %114, label %128
128: ; preds = %109, %114, %87, %12, %15, %8, %19, %24, %29, %34, %39, %44, %49, %53, %57, %61, %65, %73, %80, %11, %18
%129 = phi double [ 0.000000e+00, %18 ], [ 0.000000e+00, %11 ], [ %86, %80 ], [ %79, %73 ], [ %72, %65 ], [ %64, %61 ], [ %60, %57 ], [ %56, %53 ], [ %52, %49 ], [ %48, %44 ], [ %43, %39 ], [ %38, %34 ], [ %33, %29 ], [ %28, %24 ], [ %23, %19 ], [ 1.000000e+00, %8 ], [ 1.000000e+00, %15 ], [ 1.000000e+00, %12 ], [ 1.000000e+00, %87 ], [ %112, %109 ], [ %124, %114 ]
store double %129, double* %1
br label %130
130: ; preds = %128, %92, %3
ret void
}