#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 DBL_EPSILON;
void mp_mul_d2i(int n, int radix, int nfft, double din[], int out[]) {
  int j, carry, carry1, carry2, shift, ndata;
  double x, scale, d1_radix, d1_radix2, pow_radix, topdgt;
  scale = ((double)2) / nfft;
  d1_radix = ((double)1) / radix;
  d1_radix2 = d1_radix * d1_radix;
  topdgt = din[nfft + 1];
  x = topdgt < 0 ? -topdgt : topdgt;
  shift = x + ((double)0.5) >= radix ? 1 : 0;
  x *= nfft * ((double)0.5);
  din[nfft + 1] = din[1] - x;
  din[1] = x;
  ndata = n;
  if (n > nfft + 1 + shift) {
    ndata = nfft + 1 + shift;
    for (j = n + 1; j > ndata + 1; j--) {
      out[j] = 0;
    }
  }
  x = 0;
  pow_radix = 1;
  for (j = ndata + 1 - shift; j <= nfft + 1; j++) {
    x += pow_radix * din[j];
    pow_radix *= d1_radix;
    if (pow_radix < DBL_EPSILON) {
      break;
    }
  }
  x = d1_radix2 * (scale * x + ((double)0.5));
  carry2 = ((int)x) - 1;
  carry = (int)(radix * (x - carry2) + ((double)0.5));
  for (j = ndata; j > 1; j--) {
    x = d1_radix2 * (scale * din[j - shift] + carry + ((double)0.5));
    carry = carry2;
    carry2 = ((int)x) - 1;
    x = radix * (x - carry2);
    carry1 = (int)x;
    out[j + 1] = (int)(radix * (x - carry1));
    carry += carry1;
  }
  x = carry + ((double)radix) * carry2 + ((double)0.5);
  if (shift == 0) {
    x += scale * din[1];
  }
  carry = (int)(d1_radix * x);
  out[2] = (int)(x - ((double)radix) * carry);
  if (carry > 0) {
    for (j = n + 1; j > 2; j--) {
      out[j] = out[j - 1];
    }
    out[2] = carry;
    shift++;
  }
  x = din[0] + shift + ((double)0.5);
  shift = ((int)x) - 1;
  out[1] = shift + ((int)(x - shift));
  out[0] = topdgt > ((double)0.5) ? 1 : -1;
  if (out[2] == 0) {
    out[0] = 0;
    out[1] = 0;
  }
}


x86 assembly (clang, -O0):
<mp_mul_d2i>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xee6(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm1
movsd  0xec8(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x68(%rbp),%xmm0
jbe    119b <mp_mul_d2i+0x9b>
movsd  -0x68(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x70(%rbp)
jmp    11a5 <mp_mul_d2i+0xa5>
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe59(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
xor    %eax,%eax
mov    $0x1,%ecx
ucomisd %xmm1,%xmm0
cmovae %ecx,%eax
mov    %eax,-0x34(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm0
movsd  0xe31(%rip),%xmm1
mulsd  %xmm1,%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x40(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x40(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x4(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x4(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
add    -0x34(%rbp),%ecx
cmp    %ecx,%eax
jle    127d <mp_mul_d2i+0x17d>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jle    1278 <mp_mul_d2i+0x178>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    124a <mp_mul_d2i+0x14a>
jmp    127d <mp_mul_d2i+0x17d>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xd73(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
sub    -0x34(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     1314 <mp_mul_d2i+0x214>
movsd  -0x60(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x50(%rbp),%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm1
mov    0x2cfa(%rip),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    1301 <mp_mul_d2i+0x201>
jmp    1314 <mp_mul_d2i+0x214>
jmp    1306 <mp_mul_d2i+0x206>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    129e <mp_mul_d2i+0x19e>
movsd  -0x58(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xce1(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvttsd2si -0x40(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x30(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x30(%rbp),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xcaa(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x28(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x1,-0x24(%rbp)
jle    1436 <mp_mul_d2i+0x336>
movsd  -0x58(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm3
cvtsi2sdl -0x28(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  0xc5e(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x28(%rbp)
cvttsd2si -0x40(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x30(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x30(%rbp),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvttsd2si -0x40(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cvtsi2sdl -0x8(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x2c(%rbp),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    1377 <mp_mul_d2i+0x277>
cvtsi2sdl -0x28(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
cvtsi2sdl -0x30(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xbbb(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cmpl   $0x0,-0x34(%rbp)
jne    1488 <mp_mul_d2i+0x388>
movsd  -0x48(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x50(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x28(%rbp)
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
cvtsi2sdl -0x28(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x8(%rax)
cmpl   $0x0,-0x28(%rbp)
jle    152b <mp_mul_d2i+0x42b>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jle    1518 <mp_mul_d2i+0x418>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    14e5 <mp_mul_d2i+0x3e5>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  0xacc(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
cvttsd2si -0x40(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%ecx
movsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,0x4(%rax)
movsd  -0x68(%rbp),%xmm0
movsd  0xa8d(%rip),%xmm1
mov    $0xffffffff,%ecx
mov    $0x1,%eax
ucomisd %xmm1,%xmm0
cmova  %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0x0,0x8(%rax)
jne    15bd <mp_mul_d2i+0x4bd>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,0x4(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<mp_mul_d2i>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %r8,%r14
mov    %rcx,%rbx
mov    %edx,%r13d
mov    %edi,%r12d
cvtsi2sd %edx,%xmm2
movsd  0xeca(%rip),%xmm7
cvtsi2sd %esi,%xmm11
movsd  0xec5(%rip),%xmm4
movapd %xmm4,%xmm6
movslq %edx,%rbp
add    $0x1,%r13d
movsd  0x8(%rcx,%rbp,8),%xmm8
movapd 0xec3(%rip),%xmm0
xorpd  %xmm8,%xmm0
xorpd  %xmm3,%xmm3
movapd %xmm8,%xmm1
cmpltsd %xmm3,%xmm1
andpd  %xmm1,%xmm0
andnpd %xmm8,%xmm1
orpd   %xmm0,%xmm1
movsd  0xe8b(%rip),%xmm5
movapd %xmm2,%xmm10
mulsd  %xmm5,%xmm10
mulsd  %xmm1,%xmm10
movapd %xmm1,%xmm9
addsd  %xmm5,%xmm9
xor    %r9d,%r9d
ucomisd %xmm11,%xmm9
divsd  %xmm11,%xmm6
setae  %r9b
movsd  0x8(%rcx),%xmm0
subsd  %xmm10,%xmm0
movsd  %xmm0,0x8(%rcx,%rbp,8)
movsd  %xmm10,0x8(%rcx)
lea    (%r9,%rbp,1),%r15d
add    $0x1,%r15d
mov    %edi,%eax
cmp    %edi,%r15d
jge    127d <mp_mul_d2i+0x16d>
lea    0x1(%r15),%eax
lea    0x1(%r12),%ecx
movslq %ecx,%rcx
cmp    %eax,%r12d
cmovl  %r12d,%eax
mov    %r12d,%edx
sub    %eax,%edx
sub    %rdx,%rcx
lea    (%r14,%rcx,4),%rdi
lea    0x4(,%rdx,4),%rdx
xor    %esi,%esi
movapd %xmm8,0x40(%rsp)
movsd  %xmm11,0x18(%rsp)
movapd %xmm9,0x30(%rsp)
movapd %xmm6,0x20(%rsp)
mov    %r9,0x10(%rsp)
movsd  %xmm10,0x8(%rsp)
movsd  %xmm2,(%rsp)
call   1030 <memset@plt>
movsd  (%rsp),%xmm2
movsd  0xdc9(%rip),%xmm4
xorpd  %xmm3,%xmm3
movsd  0x8(%rsp),%xmm10
mov    0x10(%rsp),%r9
movsd  0xda9(%rip),%xmm7
movapd 0x20(%rsp),%xmm6
movapd 0x30(%rsp),%xmm9
movsd  0x18(%rsp),%xmm11
movsd  0xd9d(%rip),%xmm5
movapd 0x40(%rsp),%xmm8
mov    %r15d,%eax
divsd  %xmm2,%xmm7
movapd %xmm6,%xmm0
ucomisd %xmm11,%xmm9
mulsd  %xmm6,%xmm0
mov    %eax,%ecx
adc    $0x0,%ecx
cmp    %r13d,%ecx
jg     12db <mp_mul_d2i+0x1cb>
mov    0x2d49(%rip),%rdx
movsd  (%rdx),%xmm1
movslq %ecx,%rcx
xorpd  %xmm3,%xmm3
nopw   0x0(%rax,%rax,1)
movapd %xmm3,%xmm2
movapd %xmm4,%xmm3
movapd %xmm6,%xmm4
mulsd  %xmm3,%xmm4
mulsd  (%rbx,%rcx,8),%xmm3
addsd  %xmm2,%xmm3
ucomisd %xmm4,%xmm1
ja     12db <mp_mul_d2i+0x1cb>
lea    0x1(%rcx),%rdx
cmp    %rbp,%rcx
mov    %rdx,%rcx
jle    12b0 <mp_mul_d2i+0x1a0>
mulsd  %xmm7,%xmm3
addsd  %xmm5,%xmm3
mulsd  %xmm0,%xmm3
cvttsd2si %xmm3,%edx
add    $0xffffffff,%edx
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
subsd  %xmm1,%xmm3
mulsd  %xmm11,%xmm3
addsd  %xmm5,%xmm3
cvttsd2si %xmm3,%esi
cmp    $0x2,%eax
jl     1383 <mp_mul_d2i+0x273>
mov    %eax,%ecx
sub    %r9d,%eax
add    $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
xorps  %xmm1,%xmm1
cvtsi2sd %esi,%xmm1
mov    %eax,%esi
movsd  (%rbx,%rsi,8),%xmm2
mulsd  %xmm7,%xmm2
addsd  %xmm1,%xmm2
addsd  %xmm5,%xmm2
mulsd  %xmm0,%xmm2
cvttsd2si %xmm2,%edi
add    $0xffffffff,%edi
xorps  %xmm1,%xmm1
cvtsi2sd %edi,%xmm1
subsd  %xmm1,%xmm2
mulsd  %xmm11,%xmm2
cvttsd2si %xmm2,%esi
add    %edx,%esi
cvttpd2dq %xmm2,%xmm3
cvtdq2pd %xmm3,%xmm3
subsd  %xmm3,%xmm2
mulsd  %xmm11,%xmm2
cvttsd2si %xmm2,%edx
mov    %edx,(%r14,%rcx,4)
add    $0xffffffff,%eax
add    $0xffffffffffffffff,%rcx
mov    %edi,%edx
cmp    $0x2,%rcx
ja     1320 <mp_mul_d2i+0x210>
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
mulsd  %xmm11,%xmm1
addsd  %xmm0,%xmm1
addsd  0xc75(%rip),%xmm1
mulsd  %xmm10,%xmm7
addsd  %xmm1,%xmm7
movapd %xmm11,%xmm0
cmplesd %xmm9,%xmm0
andpd  %xmm0,%xmm1
andnpd %xmm7,%xmm0
orpd   %xmm1,%xmm0
mulsd  %xmm0,%xmm6
cvttsd2si %xmm6,%r13d
cvttpd2dq %xmm6,%xmm1
cvtdq2pd %xmm1,%xmm1
mulsd  %xmm11,%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
mov    %ecx,0x8(%r14)
test   %r13d,%r13d
jle    144a <mp_mul_d2i+0x33a>
cmp    $0x2,%r12d
jl     1432 <mp_mul_d2i+0x322>
lea    0x1(%r12),%ecx
cmp    $0x3,%ecx
mov    $0x3,%eax
mov    $0x3,%edx
cmovl  %ecx,%edx
mov    %ecx,%r11d
sub    %edx,%r11d
cmp    $0x7,%r11d
jae    14a6 <mp_mul_d2i+0x396>
lea    0x1(%rcx),%eax
lea    (%r14,%rcx,4),%rdx
add    $0xffffffff,%ecx
lea    (%r14,%rcx,4),%rcx
xor    %esi,%esi
nopl   (%rax)
mov    (%rcx,%rsi,4),%edi
mov    %edi,(%rdx,%rsi,4)
add    $0xffffffffffffffff,%rsi
lea    (%rax,%rsi,1),%edi
cmp    $0x3,%edi
jg     1420 <mp_mul_d2i+0x310>
ucomisd %xmm11,%xmm9
mov    %r13d,0x8(%r14)
mov    $0x1,%ecx
mov    $0x1,%r9d
sbb    $0xffffffff,%r9d
xorps  %xmm0,%xmm0
cvtsi2sd %r9d,%xmm0
addsd  (%rbx),%xmm0
addsd  %xmm5,%xmm0
cvttsd2si %xmm0,%eax
lea    -0x1(%rax),%edx
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edx
add    %edx,%eax
add    $0xffffffff,%eax
xor    %edx,%edx
ucomisd %xmm5,%xmm8
seta   %dl
mov    %eax,0x4(%r14)
lea    (%rdx,%rdx,1),%eax
add    $0xffffffff,%eax
mov    %eax,(%r14)
test   %ecx,%ecx
jne    1497 <mp_mul_d2i+0x387>
movq   $0x0,(%r14)
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
cmp    $0x3,%ecx
cmovl  %ecx,%eax
neg    %eax
lea    (%r12,%rax,1),%edx
add    $0x1,%edx
lea    (%r14,%rcx,4),%rax
shl    $0x2,%rdx
mov    %rax,%rsi
sub    %rdx,%rsi
cmp    %rax,%rsi
ja     140d <mp_mul_d2i+0x2fd>
mov    %r12d,%eax
lea    (%r14,%rax,4),%rsi
mov    %rsi,%rdi
sub    %rdx,%rdi
cmp    %rsi,%rdi
ja     140d <mp_mul_d2i+0x2fd>
cmp    $0x3,%ecx
mov    $0x3,%edx
cmovl  %ecx,%edx
neg    %edx
add    %r12d,%edx
add    $0x1,%edx
mov    %rcx,%rsi
sub    %rdx,%rsi
lea    (%r14,%rsi,4),%rsi
lea    (%r14,%rax,4),%rdi
add    $0x4,%rdi
cmp    %rdi,%rsi
jae    1524 <mp_mul_d2i+0x414>
lea    (%r14,%rcx,4),%rsi
add    $0x4,%rsi
sub    %rdx,%rax
lea    (%r14,%rax,4),%rax
cmp    %rsi,%rax
jb     140d <mp_mul_d2i+0x2fd>
add    $0x1,%r11
mov    $0xffffffff,%r8d
mov    %r11,%r9
and    $0xfffffffffffffff8,%r9
lea    -0x8(%r9),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rax,%rax
je     15b5 <mp_mul_d2i+0x4a5>
mov    %r10,%rbp
and    $0xfffffffffffffffe,%rbp
lea    (%r14,%rcx,4),%rsi
add    $0xfffffffffffffff4,%rsi
lea    (%rcx,%r8,1),%r15
add    $0xfffffffffffffff8,%r15
lea    (%rcx,%r8,1),%rax
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
lea    (%rax,%rdi,1),%edx
movups -0x1c(%r14,%rdx,4),%xmm0
movups -0xc(%r14,%rdx,4),%xmm1
movups %xmm1,(%rsi,%rdi,4)
movups %xmm0,-0x10(%rsi,%rdi,4)
lea    (%r15,%rdi,1),%edx
movupd -0x1c(%r14,%rdx,4),%xmm0
movupd -0xc(%r14,%rdx,4),%xmm1
movupd %xmm1,-0x20(%rsi,%rdi,4)
movupd %xmm0,-0x30(%rsi,%rdi,4)
add    $0xfffffffffffffff0,%rdi
add    $0xfffffffffffffffe,%rbp
jne    1570 <mp_mul_d2i+0x460>
neg    %rdi
jmp    15b7 <mp_mul_d2i+0x4a7>
xor    %edi,%edi
test   $0x1,%r10b
je     15e2 <mp_mul_d2i+0x4d2>
mov    %rcx,%rax
sub    %rdi,%rax
add    %eax,%r8d
movupd -0x1c(%r14,%r8,4),%xmm0
movupd -0xc(%r14,%r8,4),%xmm1
movupd %xmm1,-0xc(%r14,%rax,4)
movupd %xmm0,-0x1c(%r14,%rax,4)
cmp    %r9,%r11
je     1432 <mp_mul_d2i+0x322>
sub    %r9,%rcx
jmp    140d <mp_mul_d2i+0x2fd>

LLVM IR (-O0):
@DBL_EPSILON = global double 0.000000e+00
define void @mp_mul_d2i(i32 %0, i32 %1, i32 %2, double* %3, i32* %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double*
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store double* %3, double** %9
store i32* %4, i32** %10
%23 = load i32, i32* %8
%24 = sitofp i32 %23 to double
%25 = fdiv double 2.000000e+00, %24
store double %25, double* %18
%26 = load i32, i32* %7
%27 = sitofp i32 %26 to double
%28 = fdiv double 1.000000e+00, %27
store double %28, double* %19
%29 = load double, double* %19
%30 = load double, double* %19
%31 = fmul double %29, %30
store double %31, double* %20
%32 = load double*, double** %9
%33 = load i32, i32* %8
%34 = add nsw i32 %33, 1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds double, double* %32, i64 %35
%37 = load double, double* %36
store double %37, double* %22
%38 = load double, double* %22
%39 = fcmp olt double %38, 0.000000e+00
br i1 %39, label %40, label %43
40: ; preds = %5
%41 = load double, double* %22
%42 = fneg double %41
br label %45
43: ; preds = %5
%44 = load double, double* %22
br label %45
45: ; preds = %43, %40
%46 = phi double [ %42, %40 ], [ %44, %43 ]
store double %46, double* %17
%47 = load double, double* %17
%48 = fadd double %47, 5.000000e-01
%49 = load i32, i32* %7
%50 = sitofp i32 %49 to double
%51 = fcmp oge double %48, %50
%52 = zext i1 %51 to i64
%53 = select i1 %51, i32 1, i32 0
store i32 %53, i32* %15
%54 = load i32, i32* %8
%55 = sitofp i32 %54 to double
%56 = fmul double %55, 5.000000e-01
%57 = load double, double* %17
%58 = fmul double %57, %56
store double %58, double* %17
%59 = load double*, double** %9
%60 = getelementptr inbounds double, double* %59, i64 1
%61 = load double, double* %60
%62 = load double, double* %17
%63 = fsub double %61, %62
%64 = load double*, double** %9
%65 = load i32, i32* %8
%66 = add nsw i32 %65, 1
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds double, double* %64, i64 %67
store double %63, double* %68
%69 = load double, double* %17
%70 = load double*, double** %9
%71 = getelementptr inbounds double, double* %70, i64 1
store double %69, double* %71
%72 = load i32, i32* %6
store i32 %72, i32* %16
%73 = load i32, i32* %6
%74 = load i32, i32* %8
%75 = add nsw i32 %74, 1
%76 = load i32, i32* %15
%77 = add nsw i32 %75, %76
%78 = icmp sgt i32 %73, %77
br i1 %78, label %79, label %100
79: ; preds = %45
%80 = load i32, i32* %8
%81 = add nsw i32 %80, 1
%82 = load i32, i32* %15
%83 = add nsw i32 %81, %82
store i32 %83, i32* %16
%84 = load i32, i32* %6
%85 = add nsw i32 %84, 1
store i32 %85, i32* %11
br label %86
86: ; preds = %96, %79
%87 = load i32, i32* %11
%88 = load i32, i32* %16
%89 = add nsw i32 %88, 1
%90 = icmp sgt i32 %87, %89
br i1 %90, label %91, label %99
91: ; preds = %86
%92 = load i32*, i32** %10
%93 = load i32, i32* %11
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds i32, i32* %92, i64 %94
store i32 0, i32* %95
br label %96
96: ; preds = %91
%97 = load i32, i32* %11
%98 = add nsw i32 %97, -1
store i32 %98, i32* %11
br label %86
99: ; preds = %86
br label %100
100: ; preds = %99, %45
store double 0.000000e+00, double* %17
store double 1.000000e+00, double* %21
%101 = load i32, i32* %16
%102 = add nsw i32 %101, 1
%103 = load i32, i32* %15
%104 = sub nsw i32 %102, %103
store i32 %104, i32* %11
br label %105
105: ; preds = %127, %100
%106 = load i32, i32* %11
%107 = load i32, i32* %8
%108 = add nsw i32 %107, 1
%109 = icmp sle i32 %106, %108
br i1 %109, label %110, label %130
110: ; preds = %105
%111 = load double, double* %21
%112 = load double*, double** %9
%113 = load i32, i32* %11
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds double, double* %112, i64 %114
%116 = load double, double* %115
%117 = load double, double* %17
%118 = call double @llvm.fmuladd.f64(double %111, double %116, double %117)
store double %118, double* %17
%119 = load double, double* %19
%120 = load double, double* %21
%121 = fmul double %120, %119
store double %121, double* %21
%122 = load double, double* %21
%123 = load double, double* @DBL_EPSILON
%124 = fcmp olt double %122, %123
br i1 %124, label %125, label %126
125: ; preds = %110
br label %130
126: ; preds = %110
br label %127
127: ; preds = %126
%128 = load i32, i32* %11
%129 = add nsw i32 %128, 1
store i32 %129, i32* %11
br label %105
130: ; preds = %125, %105
%131 = load double, double* %20
%132 = load double, double* %18
%133 = load double, double* %17
%134 = call double @llvm.fmuladd.f64(double %132, double %133, double 5.000000e-01)
%135 = fmul double %131, %134
store double %135, double* %17
%136 = load double, double* %17
%137 = fptosi double %136 to i32
%138 = sub nsw i32 %137, 1
store i32 %138, i32* %14
%139 = load i32, i32* %7
%140 = sitofp i32 %139 to double
%141 = load double, double* %17
%142 = load i32, i32* %14
%143 = sitofp i32 %142 to double
%144 = fsub double %141, %143
%145 = call double @llvm.fmuladd.f64(double %140, double %144, double 5.000000e-01)
%146 = fptosi double %145 to i32
store i32 %146, i32* %12
%147 = load i32, i32* %16
store i32 %147, i32* %11
br label %148
148: ; preds = %195, %130
%149 = load i32, i32* %11
%150 = icmp sgt i32 %149, 1
br i1 %150, label %151, label %198
151: ; preds = %148
%152 = load double, double* %20
%153 = load double, double* %18
%154 = load double*, double** %9
%155 = load i32, i32* %11
%156 = load i32, i32* %15
%157 = sub nsw i32 %155, %156
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds double, double* %154, i64 %158
%160 = load double, double* %159
%161 = load i32, i32* %12
%162 = sitofp i32 %161 to double
%163 = call double @llvm.fmuladd.f64(double %153, double %160, double %162)
%164 = fadd double %163, 5.000000e-01
%165 = fmul double %152, %164
store double %165, double* %17
%166 = load i32, i32* %14
store i32 %166, i32* %12
%167 = load double, double* %17
%168 = fptosi double %167 to i32
%169 = sub nsw i32 %168, 1
store i32 %169, i32* %14
%170 = load i32, i32* %7
%171 = sitofp i32 %170 to double
%172 = load double, double* %17
%173 = load i32, i32* %14
%174 = sitofp i32 %173 to double
%175 = fsub double %172, %174
%176 = fmul double %171, %175
store double %176, double* %17
%177 = load double, double* %17
%178 = fptosi double %177 to i32
store i32 %178, i32* %13
%179 = load i32, i32* %7
%180 = sitofp i32 %179 to double
%181 = load double, double* %17
%182 = load i32, i32* %13
%183 = sitofp i32 %182 to double
%184 = fsub double %181, %183
%185 = fmul double %180, %184
%186 = fptosi double %185 to i32
%187 = load i32*, i32** %10
%188 = load i32, i32* %11
%189 = add nsw i32 %188, 1
%190 = sext i32 %189 to i64
%191 = getelementptr inbounds i32, i32* %187, i64 %190
store i32 %186, i32* %191
%192 = load i32, i32* %13
%193 = load i32, i32* %12
%194 = add nsw i32 %193, %192
store i32 %194, i32* %12
br label %195
195: ; preds = %151
%196 = load i32, i32* %11
%197 = add nsw i32 %196, -1
store i32 %197, i32* %11
br label %148
198: ; preds = %148
%199 = load i32, i32* %12
%200 = sitofp i32 %199 to double
%201 = load i32, i32* %7
%202 = sitofp i32 %201 to double
%203 = load i32, i32* %14
%204 = sitofp i32 %203 to double
%205 = call double @llvm.fmuladd.f64(double %202, double %204, double %200)
%206 = fadd double %205, 5.000000e-01
store double %206, double* %17
%207 = load i32, i32* %15
%208 = icmp eq i32 %207, 0
br i1 %208, label %209, label %216
209: ; preds = %198
%210 = load double, double* %18
%211 = load double*, double** %9
%212 = getelementptr inbounds double, double* %211, i64 1
%213 = load double, double* %212
%214 = load double, double* %17
%215 = call double @llvm.fmuladd.f64(double %210, double %213, double %214)
store double %215, double* %17
br label %216
216: ; preds = %209, %198
%217 = load double, double* %19
%218 = load double, double* %17
%219 = fmul double %217, %218
%220 = fptosi double %219 to i32
store i32 %220, i32* %12
%221 = load double, double* %17
%222 = load i32, i32* %7
%223 = sitofp i32 %222 to double
%224 = load i32, i32* %12
%225 = sitofp i32 %224 to double
%226 = fneg double %223
%227 = call double @llvm.fmuladd.f64(double %226, double %225, double %221)
%228 = fptosi double %227 to i32
%229 = load i32*, i32** %10
%230 = getelementptr inbounds i32, i32* %229, i64 2
store i32 %228, i32* %230
%231 = load i32, i32* %12
%232 = icmp sgt i32 %231, 0
br i1 %232, label %233, label %259
233: ; preds = %216
%234 = load i32, i32* %6
%235 = add nsw i32 %234, 1
store i32 %235, i32* %11
br label %236
236: ; preds = %250, %233
%237 = load i32, i32* %11
%238 = icmp sgt i32 %237, 2
br i1 %238, label %239, label %253
239: ; preds = %236
%240 = load i32*, i32** %10
%241 = load i32, i32* %11
%242 = sub nsw i32 %241, 1
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds i32, i32* %240, i64 %243
%245 = load i32, i32* %244
%246 = load i32*, i32** %10
%247 = load i32, i32* %11
%248 = sext i32 %247 to i64
%249 = getelementptr inbounds i32, i32* %246, i64 %248
store i32 %245, i32* %249
br label %250
250: ; preds = %239
%251 = load i32, i32* %11
%252 = add nsw i32 %251, -1
store i32 %252, i32* %11
br label %236
253: ; preds = %236
%254 = load i32, i32* %12
%255 = load i32*, i32** %10
%256 = getelementptr inbounds i32, i32* %255, i64 2
store i32 %254, i32* %256
%257 = load i32, i32* %15
%258 = add nsw i32 %257, 1
store i32 %258, i32* %15
br label %259
259: ; preds = %253, %216
%260 = load double*, double** %9
%261 = getelementptr inbounds double, double* %260, i64 0
%262 = load double, double* %261
%263 = load i32, i32* %15
%264 = sitofp i32 %263 to double
%265 = fadd double %262, %264
%266 = fadd double %265, 5.000000e-01
store double %266, double* %17
%267 = load double, double* %17
%268 = fptosi double %267 to i32
%269 = sub nsw i32 %268, 1
store i32 %269, i32* %15
%270 = load i32, i32* %15
%271 = load double, double* %17
%272 = load i32, i32* %15
%273 = sitofp i32 %272 to double
%274 = fsub double %271, %273
%275 = fptosi double %274 to i32
%276 = add nsw i32 %270, %275
%277 = load i32*, i32** %10
%278 = getelementptr inbounds i32, i32* %277, i64 1
store i32 %276, i32* %278
%279 = load double, double* %22
%280 = fcmp ogt double %279, 5.000000e-01
%281 = zext i1 %280 to i64
%282 = select i1 %280, i32 1, i32 -1
%283 = load i32*, i32** %10
%284 = getelementptr inbounds i32, i32* %283, i64 0
store i32 %282, i32* %284
%285 = load i32*, i32** %10
%286 = getelementptr inbounds i32, i32* %285, i64 2
%287 = load i32, i32* %286
%288 = icmp eq i32 %287, 0
br i1 %288, label %289, label %294
289: ; preds = %259
%290 = load i32*, i32** %10
%291 = getelementptr inbounds i32, i32* %290, i64 0
store i32 0, i32* %291
%292 = load i32*, i32** %10
%293 = getelementptr inbounds i32, i32* %292, i64 1
store i32 0, i32* %293
br label %294
294: ; preds = %289, %259
ret void
}

LLVM IR (-O2):
@DBL_EPSILON = global double 0.000000e+00
define void @mp_mul_d2i(i32 %0, i32 %1, i32 %2, double* nocapture %3, i32* nocapture %4) {
%6 = sitofp i32 %2 to double
%7 = fdiv double 2.000000e+00, %6
%8 = sitofp i32 %1 to double
%9 = fdiv double 1.000000e+00, %8
%10 = fmul double %9, %9
%11 = add nsw i32 %2, 1
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds double, double* %3, i64 %12
%14 = load double, double* %13
%15 = fcmp olt double %14, 0.000000e+00
%16 = fneg double %14
%17 = select i1 %15, double %16, double %14
%18 = fadd double %17, 5.000000e-01
%19 = fcmp oge double %18, %8
%20 = zext i1 %19 to i32
%21 = fmul double %6, 5.000000e-01
%22 = fmul double %21, %17
%23 = getelementptr inbounds double, double* %3, i64 1
%24 = load double, double* %23
%25 = fsub double %24, %22
store double %25, double* %13
store double %22, double* %23
%26 = add nsw i32 %11, %20
%27 = icmp slt i32 %26, %0
br i1 %27, label %28, label %40
28: ; preds = %5
%29 = add nsw i32 %26, 1
%30 = add i32 %0, 1
%31 = sext i32 %30 to i64
%32 = call i32 @llvm.smin.i32(i32 %0, i32 %29)
%33 = sub i32 %0, %32
%34 = zext i32 %33 to i64
%35 = sub nsw i64 %31, %34
%36 = getelementptr i32, i32* %4, i64 %35
%37 = bitcast i32* %36 to i8*
%38 = shl nuw nsw i64 %34, 2
%39 = add nuw nsw i64 %38, 4
br label %40
40: ; preds = %28, %5
%41 = phi i32 [ %0, %5 ], [ %26, %28 ]
%42 = xor i1 %19, true
%43 = zext i1 %42 to i32
%44 = add i32 %41, %43
%45 = icmp sgt i32 %44, %11
br i1 %45, label %62, label %46
46: ; preds = %40
%47 = load double, double* @DBL_EPSILON
%48 = sext i32 %44 to i64
%49 = sext i32 %2 to i64
br label %50
50: ; preds = %50, %46
%51 = phi i64 [ %48, %46 ], [ %59, %50 ]
%52 = phi double [ 1.000000e+00, %46 ], [ %57, %50 ]
%53 = phi double [ 0.000000e+00, %46 ], [ %56, %50 ]
%54 = getelementptr inbounds double, double* %3, i64 %51
%55 = load double, double* %54
%56 = tail call double @llvm.fmuladd.f64(double %52, double %55, double %53)
%57 = fmul double %9, %52
%58 = fcmp olt double %57, %47
%59 = add i64 %51, 1
%60 = icmp sgt i64 %51, %49
%61 = select i1 %58, i1 true, i1 %60
br i1 %61, label %62, label %50
62: ; preds = %50, %40
%63 = phi double [ 0.000000e+00, %40 ], [ %56, %50 ]
%64 = tail call double @llvm.fmuladd.f64(double %7, double %63, double 5.000000e-01)
%65 = fmul double %10, %64
%66 = fptosi double %65 to i32
%67 = add nsw i32 %66, -1
%68 = sitofp i32 %67 to double
%69 = fsub double %65, %68
%70 = tail call double @llvm.fmuladd.f64(double %8, double %69, double 5.000000e-01)
%71 = fptosi double %70 to i32
%72 = icmp sgt i32 %41, 1
br i1 %72, label %73, label %103
73: ; preds = %62
%74 = zext i32 %41 to i64
br label %75
75: ; preds = %73, %75
%76 = phi i64 [ %74, %73 ], [ %101, %75 ]
%77 = phi i32 [ %71, %73 ], [ %100, %75 ]
%78 = phi i32 [ %67, %73 ], [ %89, %75 ]
%79 = trunc i64 %76 to i32
%80 = sub nsw i32 %79, %20
%81 = zext i32 %80 to i64
%82 = getelementptr inbounds double, double* %3, i64 %81
%83 = load double, double* %82
%84 = sitofp i32 %77 to double
%85 = tail call double @llvm.fmuladd.f64(double %7, double %83, double %84)
%86 = fadd double %85, 5.000000e-01
%87 = fmul double %10, %86
%88 = fptosi double %87 to i32
%89 = add nsw i32 %88, -1
%90 = sitofp i32 %89 to double
%91 = fsub double %87, %90
%92 = fmul double %91, %8
%93 = fptosi double %92 to i32
%94 = sitofp i32 %93 to double
%95 = fsub double %92, %94
%96 = fmul double %95, %8
%97 = fptosi double %96 to i32
%98 = add nuw nsw i64 %76, 1
%99 = getelementptr inbounds i32, i32* %4, i64 %98
store i32 %97, i32* %99
%100 = add nsw i32 %78, %93
%101 = add nsw i64 %76, -1
%102 = icmp ugt i64 %76, 2
br i1 %102, label %75, label %103
103: ; preds = %75, %62
%104 = phi double [ %68, %62 ], [ %90, %75 ]
%105 = phi i32 [ %71, %62 ], [ %100, %75 ]
%106 = sitofp i32 %105 to double
%107 = tail call double @llvm.fmuladd.f64(double %8, double %104, double %106)
%108 = fadd double %107, 5.000000e-01
%109 = tail call double @llvm.fmuladd.f64(double %7, double %22, double %108)
%110 = select i1 %19, double %108, double %109
%111 = fmul double %9, %110
%112 = fptosi double %111 to i32
%113 = sitofp i32 %112 to double
%114 = fneg double %8
%115 = tail call double @llvm.fmuladd.f64(double %114, double %113, double %110)
%116 = fptosi double %115 to i32
%117 = getelementptr inbounds i32, i32* %4, i64 2
store i32 %116, i32* %117
%118 = icmp sgt i32 %112, 0
br i1 %118, label %119, label %249
119: ; preds = %103
%120 = icmp sgt i32 %0, 1
br i1 %120, label %121, label %247
121: ; preds = %119
%122 = add i32 %0, 1
%123 = zext i32 %122 to i64
%124 = call i32 @llvm.smin.i32(i32 %122, i32 3)
%125 = sub i32 %122, %124
%126 = zext i32 %125 to i64
%127 = add nuw nsw i64 %126, 1
%128 = icmp ult i32 %125, 7
br i1 %128, label %236, label %129
129: ; preds = %121
%130 = add i32 %0, 1
%131 = call i32 @llvm.smin.i32(i32 %122, i32 3)
%132 = sub i32 %130, %131
%133 = getelementptr i32, i32* %4, i64 %123
%134 = zext i32 %132 to i64
%135 = sub nsw i64 0, %134
%136 = getelementptr i32, i32* %133, i64 %135
%137 = icmp ugt i32* %136, %133
%138 = zext i32 %0 to i64
%139 = getelementptr i32, i32* %4, i64 %138
%140 = zext i32 %132 to i64
%141 = sub nsw i64 0, %140
%142 = getelementptr i32, i32* %139, i64 %141
%143 = icmp ugt i32* %142, %139
%144 = or i1 %137, %143
br i1 %144, label %236, label %145
145: ; preds = %129
%146 = add i32 %0, 1
%147 = call i32 @llvm.smin.i32(i32 %122, i32 3)
%148 = sub i32 %146, %147
%149 = zext i32 %148 to i64
%150 = sub nsw i64 %123, %149
%151 = getelementptr i32, i32* %4, i64 %150
%152 = add nuw nsw i64 %123, 1
%153 = getelementptr i32, i32* %4, i64 %152
%154 = zext i32 %0 to i64
%155 = sub nsw i64 %154, %149
%156 = getelementptr i32, i32* %4, i64 %155
%157 = add nuw nsw i64 %154, 1
%158 = getelementptr i32, i32* %4, i64 %157
%159 = icmp ult i32* %151, %158
%160 = icmp ult i32* %156, %153
%161 = and i1 %159, %160
br i1 %161, label %236, label %162
162: ; preds = %145
%163 = and i64 %127, 8589934584
%164 = sub nsw i64 %123, %163
%165 = add nsw i64 %163, -8
%166 = lshr exact i64 %165, 3
%167 = add nuw nsw i64 %166, 1
%168 = and i64 %167, 1
%169 = icmp eq i64 %165, 0
br i1 %169, label %213, label %170
170: ; preds = %162
%171 = and i64 %167, 4611686018427387902
br label %172
172: ; preds = %172, %170
%173 = phi i64 [ 0, %170 ], [ %210, %172 ]
%174 = phi i64 [ 0, %170 ], [ %211, %172 ]
%175 = sub i64 %123, %173
%176 = add i64 %175, 4294967295
%177 = and i64 %176, 4294967295
%178 = getelementptr inbounds i32, i32* %4, i64 %177
%179 = getelementptr inbounds i32, i32* %178, i64 -3
%180 = bitcast i32* %179 to <4 x i32>*
%181 = load <4 x i32>, <4 x i32>* %180
%182 = getelementptr inbounds i32, i32* %178, i64 -4
%183 = getelementptr inbounds i32, i32* %182, i64 -3
%184 = bitcast i32* %183 to <4 x i32>*
%185 = load <4 x i32>, <4 x i32>* %184
%186 = getelementptr inbounds i32, i32* %4, i64 %175
%187 = getelementptr inbounds i32, i32* %186, i64 -3
%188 = bitcast i32* %187 to <4 x i32>*
store <4 x i32> %181, <4 x i32>* %188
%189 = getelementptr inbounds i32, i32* %186, i64 -4
%190 = getelementptr inbounds i32, i32* %189, i64 -3
%191 = bitcast i32* %190 to <4 x i32>*
store <4 x i32> %185, <4 x i32>* %191
%192 = or i64 %173, 8
%193 = sub i64 %123, %192
%194 = add i64 %193, 4294967295
%195 = and i64 %194, 4294967295
%196 = getelementptr inbounds i32, i32* %4, i64 %195
%197 = getelementptr inbounds i32, i32* %196, i64 -3
%198 = bitcast i32* %197 to <4 x i32>*
%199 = load <4 x i32>, <4 x i32>* %198
%200 = getelementptr inbounds i32, i32* %196, i64 -4
%201 = getelementptr inbounds i32, i32* %200, i64 -3
%202 = bitcast i32* %201 to <4 x i32>*
%203 = load <4 x i32>, <4 x i32>* %202
%204 = getelementptr inbounds i32, i32* %4, i64 %193
%205 = getelementptr inbounds i32, i32* %204, i64 -3
%206 = bitcast i32* %205 to <4 x i32>*
store <4 x i32> %199, <4 x i32>* %206
%207 = getelementptr inbounds i32, i32* %204, i64 -4
%208 = getelementptr inbounds i32, i32* %207, i64 -3
%209 = bitcast i32* %208 to <4 x i32>*
store <4 x i32> %203, <4 x i32>* %209
%210 = add nuw i64 %173, 16
%211 = add i64 %174, 2
%212 = icmp eq i64 %211, %171
br i1 %212, label %213, label %172
213: ; preds = %172, %162
%214 = phi i64 [ 0, %162 ], [ %210, %172 ]
%215 = icmp eq i64 %168, 0
br i1 %215, label %234, label %216
216: ; preds = %213
%217 = sub i64 %123, %214
%218 = add i64 %217, 4294967295
%219 = and i64 %218, 4294967295
%220 = getelementptr inbounds i32, i32* %4, i64 %219
%221 = getelementptr inbounds i32, i32* %220, i64 -3
%222 = bitcast i32* %221 to <4 x i32>*
%223 = load <4 x i32>, <4 x i32>* %222
%224 = getelementptr inbounds i32, i32* %220, i64 -4
%225 = getelementptr inbounds i32, i32* %224, i64 -3
%226 = bitcast i32* %225 to <4 x i32>*
%227 = load <4 x i32>, <4 x i32>* %226
%228 = getelementptr inbounds i32, i32* %4, i64 %217
%229 = getelementptr inbounds i32, i32* %228, i64 -3
%230 = bitcast i32* %229 to <4 x i32>*
store <4 x i32> %223, <4 x i32>* %230
%231 = getelementptr inbounds i32, i32* %228, i64 -4
%232 = getelementptr inbounds i32, i32* %231, i64 -3
%233 = bitcast i32* %232 to <4 x i32>*
store <4 x i32> %227, <4 x i32>* %233
br label %234
234: ; preds = %213, %216
%235 = icmp eq i64 %127, %163
br i1 %235, label %247, label %236
236: ; preds = %145, %129, %121, %234
%237 = phi i64 [ %123, %145 ], [ %123, %129 ], [ %123, %121 ], [ %164, %234 ]
br label %238
238: ; preds = %236, %238
%239 = phi i64 [ %240, %238 ], [ %237, %236 ]
%240 = add nsw i64 %239, -1
%241 = and i64 %240, 4294967295
%242 = getelementptr inbounds i32, i32* %4, i64 %241
%243 = load i32, i32* %242
%244 = getelementptr inbounds i32, i32* %4, i64 %239
store i32 %243, i32* %244
%245 = trunc i64 %239 to i32
%246 = icmp sgt i32 %245, 3
br i1 %246, label %238, label %247
247: ; preds = %238, %234, %119
store i32 %112, i32* %117
%248 = select i1 %19, i32 2, i32 1
br label %249
249: ; preds = %247, %103
%250 = phi i32 [ 1, %247 ], [ %116, %103 ]
%251 = phi i32 [ %248, %247 ], [ %20, %103 ]
%252 = load double, double* %3
%253 = sitofp i32 %251 to double
%254 = fadd double %252, %253
%255 = fadd double %254, 5.000000e-01
%256 = fptosi double %255 to i32
%257 = add nsw i32 %256, -1
%258 = sitofp i32 %257 to double
%259 = fsub double %255, %258
%260 = fptosi double %259 to i32
%261 = add nsw i32 %257, %260
%262 = getelementptr inbounds i32, i32* %4, i64 1
store i32 %261, i32* %262
%263 = fcmp ogt double %14, 5.000000e-01
%264 = select i1 %263, i32 1, i32 -1
store i32 %264, i32* %4
%265 = icmp eq i32 %250, 0
br i1 %265, label %266, label %267
266: ; preds = %249
store i32 0, i32* %4
store i32 0, i32* %262
br label %267
267: ; preds = %266, %249
ret void
}