void yil_cone(float *buff, int num, int angles, int height, float *normal) {
  if (angles < 4)
    return;
  int minNum = angles * 4 * height;
  if (num < minNum)
    return;
  float r = 1;
  float rstep = 1.f / height;
  int n1, n2;
  for (int y = 0; y < height; y++) {
    float lastX = 1, lastZ = 0;
    float step = (2 * 3.14159265358979) / angles;
    float phi = step;
    int k = 0;
    for (int n = 0; n < angles * 16;) {
      int off = y * 16 * angles;
      buff[off + n + 0] = r * lastX;
      buff[off + n + 1] = y;
      buff[off + n + 2] = r * lastZ;
      buff[off + n + 3] = 1;
      n1 = n;
      n += 4;
      r -= rstep;
      buff[off + n + 0] = r * lastX;
      buff[off + n + 1] = y + 1;
      buff[off + n + 2] = r * lastZ;
      buff[off + n + 3] = 1;
      n2 = n;
      n += 4;
      lastZ = sin(phi);
      lastX = cos(phi);
      buff[off + n + 0] = r * lastX;
      buff[off + n + 1] = y + 1;
      buff[off + n + 2] = r * lastZ;
      buff[off + n + 3] = 1;
      n += 4;
      r += rstep;
      buff[off + n + 0] = r * lastX;
      buff[off + n + 1] = y;
      buff[off + n + 2] = r * lastZ;
      buff[off + n + 3] = 1;
      float a[4] = {buff[n2 + 0] - buff[n1 + 0], buff[n2 + 1] - buff[n1 + 1],
                    buff[n2 + 2] - buff[n1 + 2], 0};
      float b[4] = {buff[n + 0] - buff[n1 + 0], buff[n + 1] - buff[n1 + 1],
                    buff[n + 2] - buff[n1 + 2], 0};
      float norm[4] = {a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2],
                       a[0] * b[1] - a[1] * b[0], 0};
      float length =
          sqrt(norm[0] * norm[0] + norm[1] * norm[1] + norm[2] * norm[2]);
      norm[0] /= length;
      norm[1] /= length;
      norm[2] /= length;
      if (norm[1] > 0) {
        norm[0] = -norm[0];
        norm[1] = -norm[1];
        norm[2] = -norm[2];
      }
      for (; k <= n; k += 4) {
        normal[off + k + 0] = norm[0];
        normal[off + k + 1] = norm[1];
        normal[off + k + 2] = norm[2];
        normal[off + k + 3] = norm[3];
      }
      n += 4;
      phi += step;
    }
    r -= rstep;
  }
}


x86 assembly (clang, -O0):
<yil_cone>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
cmpl   $0x4,-0x10(%rbp)
jge    115b <yil_cone+0x2b>
jmp    17f2 <yil_cone+0x6c2>
mov    -0x10(%rbp),%eax
shl    $0x2,%eax
imul   -0x14(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1179 <yil_cone+0x49>
jmp    17f2 <yil_cone+0x6c2>
movss  0xe7f(%rip),%xmm0
movss  %xmm0,-0x28(%rbp)
cvtsi2ssl -0x14(%rbp),%xmm1
movss  0xe6d(%rip),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    17f2 <yil_cone+0x6c2>
movss  0xe49(%rip),%xmm0
movss  %xmm0,-0x3c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
cvtsi2sdl -0x10(%rbp),%xmm1
movsd  0xe37(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    -0x10(%rbp),%ecx
shl    $0x4,%ecx
cmp    %ecx,%eax
jge    17d1 <yil_cone+0x6a1>
mov    -0x38(%rbp),%eax
shl    $0x4,%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x54(%rbp)
movss  -0x28(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2ssl -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x28(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  0xd7c(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x50(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x50(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x50(%rbp)
movss  -0x2c(%rbp),%xmm1
movss  -0x28(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
cvtsi2ss %eax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x28(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  0xce0(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x50(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x50(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x50(%rbp)
movss  -0x48(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x48(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <cos@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x28(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
cvtsi2ss %eax,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x28(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  0xc29(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x50(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x50(%rbp)
movss  -0x2c(%rbp),%xmm0
addss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2ssl -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x28(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x50(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  0xb9c(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x70(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x6c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x64(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x80(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x7c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x50(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x78(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x74(%rbp)
movss  -0x6c(%rbp),%xmm0
movss  -0x78(%rbp),%xmm2
movss  -0x68(%rbp),%xmm1
mulss  -0x7c(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x90(%rbp)
ff
movss  -0x68(%rbp),%xmm0
movss  -0x80(%rbp),%xmm2
movss  -0x70(%rbp),%xmm1
mulss  -0x78(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
movss  -0x70(%rbp),%xmm0
movss  -0x7c(%rbp),%xmm2
movss  -0x6c(%rbp),%xmm1
mulss  -0x80(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x88(%rbp)
ff
xorps  %xmm0,%xmm0
movss  %xmm0,-0x84(%rbp)
ff
movss  -0x90(%rbp),%xmm1
ff
movss  -0x90(%rbp),%xmm2
ff
movss  -0x8c(%rbp),%xmm0
ff
mulss  -0x8c(%rbp),%xmm0
ff
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x88(%rbp),%xmm0
ff
movss  -0x88(%rbp),%xmm2
ff
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
call   1050 <sqrt@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x94(%rbp)
ff
movss  -0x94(%rbp),%xmm1
ff
movss  -0x90(%rbp),%xmm0
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x90(%rbp)
ff
movss  -0x94(%rbp),%xmm1
ff
movss  -0x8c(%rbp),%xmm0
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
movss  -0x94(%rbp),%xmm1
ff
movss  -0x88(%rbp),%xmm0
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x88(%rbp)
ff
movss  -0x8c(%rbp),%xmm0
ff
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jbe    1721 <yil_cone+0x5f1>
movss  -0x90(%rbp),%xmm0
ff
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x90(%rbp)
ff
movss  -0x8c(%rbp),%xmm0
ff
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
movss  -0x88(%rbp),%xmm0
ff
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x88(%rbp)
ff
jmp    1726 <yil_cone+0x5f6>
mov    -0x4c(%rbp),%eax
cmp    -0x50(%rbp),%eax
jg     17b4 <yil_cone+0x684>
movss  -0x90(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x4c(%rbp),%ecx
add    $0x0,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x4c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x54(%rbp),%ecx
add    -0x4c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x4c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x4c(%rbp)
jmp    1726 <yil_cone+0x5f6>
mov    -0x50(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x50(%rbp)
movss  -0x44(%rbp),%xmm0
addss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
jmp    11f6 <yil_cone+0xc6>
movss  -0x2c(%rbp),%xmm1
movss  -0x28(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11a3 <yil_cone+0x73>
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<yil_cone>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xe8,%rsp
mov    %r8,0x58(%rsp)
mov    %edx,0x8(%rsp)
cmp    $0x4,%edx
jl     17db <yil_cone+0x6ab>
mov    0x8(%rsp),%eax
imul   %ecx,%eax
shl    $0x2,%eax
cmp    %esi,%eax
jg     17db <yil_cone+0x6ab>
test   %ecx,%ecx
jle    17db <yil_cone+0x6ab>
mov    %rdi,%rbp
cvtsi2ss %ecx,%xmm0
movss  0xe84(%rip),%xmm2
movaps %xmm2,%xmm1
divss  %xmm0,%xmm1
movss  %xmm1,0xc(%rsp)
mov    0x8(%rsp),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0xe6c(%rip),%xmm1
divsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,0x1c(%rsp)
shl    $0x4,%eax
mov    %eax,0x38(%rsp)
cltq
mov    %rax,0xb8(%rsp)
mov    %ecx,%eax
mov    %rax,0x90(%rsp)
mov    0x58(%rsp),%rax
lea    0x40(%rax),%rcx
mov    %rcx,0xa8(%rsp)
add    $0xc,%rax
mov    %rax,0x88(%rsp)
xor    %eax,%eax
xor    %ecx,%ecx
movaps %xmm2,%xmm15
jmp    1219 <yil_cone+0xe9>
nop
subss  0xc(%rsp),%xmm15
mov    0xa0(%rsp),%rax
add    0x38(%rsp),%eax
mov    0x98(%rsp),%rcx
cmp    0x90(%rsp),%rcx
je     17db <yil_cone+0x6ab>
mov    %rax,0xa0(%rsp)
movslq %eax,%rdx
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
movss  %xmm0,0x28(%rsp)
mov    0x88(%rsp),%rax
mov    %rdx,0xb0(%rsp)
lea    (%rax,%rdx,4),%r14
mov    %ecx,%eax
imul   0x8(%rsp),%eax
shl    $0x4,%eax
add    $0x1,%rcx
mov    %rcx,0x98(%rsp)
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
movss  %xmm0,0x24(%rsp)
cltq
mov    %rax,0x60(%rsp)
mov    $0xd,%r10d
xor    %r15d,%r15d
movss  0xd7f(%rip),%xmm8
xorps  %xmm1,%xmm1
movss  0x1c(%rsp),%xmm9
movl   $0x0,0x20(%rsp)
jmp    12c7 <yil_cone+0x197>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %eax,0x20(%rsp)
add    $0x10,%r15
addss  0x1c(%rsp),%xmm9
add    $0x10,%r10
cmp    0xb8(%rsp),%r15
movss  0x2c(%rsp),%xmm1
jge    11f0 <yil_cone+0xc0>
mov    %r15,0x30(%rsp)
mov    %r10,0x68(%rsp)
movaps %xmm8,%xmm0
mulss  %xmm15,%xmm0
mov    0x60(%rsp),%r13
lea    (%r15,%r13,1),%rax
movss  %xmm0,0x0(%rbp,%rax,4)
shl    $0x2,%rax
mov    %rax,%rcx
or     $0x4,%rcx
movss  0x28(%rsp),%xmm0
movss  %xmm0,0x0(%rbp,%rcx,1)
movaps %xmm1,%xmm0
mulss  %xmm15,%xmm0
mov    %rax,%rcx
or     $0x8,%rcx
movss  %xmm0,0x0(%rbp,%rcx,1)
or     $0xc,%rax
movl   $0x3f800000,0x0(%rbp,%rax,1)
3f
mov    0x30(%rsp),%r15
or     $0x4,%r15
subss  0xc(%rsp),%xmm15
mulss  %xmm15,%xmm8
movss  %xmm15,0x40(%rsp)
lea    (%r15,%r13,1),%rax
movss  %xmm8,0x0(%rbp,%rax,4)
shl    $0x2,%rax
mov    %rax,%rcx
or     $0x4,%rcx
movss  0x24(%rsp),%xmm0
movss  %xmm0,0x0(%rbp,%rcx,1)
mulss  %xmm15,%xmm1
mov    %rax,%rcx
or     $0x8,%rcx
movss  %xmm1,0x0(%rbp,%rcx,1)
or     $0xc,%rax
movl   $0x3f800000,0x0(%rbp,%rax,1)
3f
mov    0x30(%rsp),%rbx
or     $0x8,%rbx
movss  %xmm9,0x70(%rsp)
xorps  %xmm0,%xmm0
cvtss2sd %xmm9,%xmm0
movsd  %xmm0,0x10(%rsp)
call   1030 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x2c(%rsp)
movsd  0x10(%rsp),%xmm0
call   1050 <cos@plt>
xorps  %xmm8,%xmm8
cvtsd2ss %xmm0,%xmm8
movss  0x40(%rsp),%xmm1
movaps %xmm1,%xmm0
mulss  %xmm8,%xmm0
add    %r13,%rbx
movss  %xmm0,0x0(%rbp,%rbx,4)
movslq %ebx,%rax
shl    $0x2,%rax
mov    %rax,%rcx
or     $0x4,%rcx
movss  0x24(%rsp),%xmm0
movss  %xmm0,0x0(%rbp,%rcx,1)
movss  0xc(%rsp),%xmm15
movaps %xmm1,%xmm0
addss  %xmm1,%xmm15
movss  0x2c(%rsp),%xmm1
mulss  %xmm1,%xmm0
mov    %rax,%rcx
or     $0x8,%rcx
movss  %xmm0,0x0(%rbp,%rcx,1)
or     $0xc,%rax
movl   $0x3f800000,0x0(%rbp,%rax,1)
3f
mov    0x30(%rsp),%r12
or     $0xc,%r12
movaps %xmm15,%xmm0
mulss  %xmm8,%xmm0
lea    (%r12,%r13,1),%rax
movss  %xmm0,0x0(%rbp,%rax,4)
cltq
shl    $0x2,%rax
mov    %rax,%rcx
or     $0x4,%rcx
movss  0x28(%rsp),%xmm0
movss  %xmm0,0x0(%rbp,%rcx,1)
movaps %xmm15,%xmm0
mulss  %xmm1,%xmm0
mov    %rax,%rcx
or     $0x8,%rcx
movss  %xmm0,0x0(%rbp,%rcx,1)
or     $0xc,%rax
movl   $0x3f800000,0x0(%rbp,%rax,1)
3f
movss  0x0(%rbp,%r15,4),%xmm0
mov    0x30(%rsp),%r15
lea    0x0(,%r15,4),%rax
movss  0x0(%rbp,%r15,4),%xmm2
subss  %xmm2,%xmm0
mov    %rax,%rcx
or     $0x14,%rcx
movss  0x0(%rbp,%rcx,1),%xmm1
mov    %rax,%rcx
or     $0x4,%rcx
movss  0x0(%rbp,%rcx,1),%xmm7
subss  %xmm7,%xmm1
mov    %rax,%rcx
or     $0x18,%rcx
movss  0x0(%rbp,%rcx,1),%xmm6
mov    %rax,%rcx
or     $0x8,%rcx
movss  0x0(%rbp,%rcx,1),%xmm4
subss  %xmm4,%xmm6
movss  0x0(%rbp,%r12,4),%xmm5
subss  %xmm2,%xmm5
mov    %rax,%rcx
or     $0x34,%rcx
movss  0x0(%rbp,%rcx,1),%xmm3
subss  %xmm7,%xmm3
or     $0x38,%rax
movss  0x0(%rbp,%rax,1),%xmm2
subss  %xmm4,%xmm2
movaps %xmm3,%xmm4
mulss  %xmm6,%xmm4
mulss  %xmm5,%xmm6
mulss  %xmm1,%xmm5
movaps %xmm1,%xmm7
mulss  %xmm2,%xmm7
subss  %xmm4,%xmm7
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm6
mulss  %xmm0,%xmm3
subss  %xmm5,%xmm3
movaps %xmm6,%xmm0
mulss  %xmm6,%xmm0
movaps %xmm7,%xmm1
mulss  %xmm7,%xmm1
addss  %xmm0,%xmm1
movaps %xmm3,%xmm0
mulss  %xmm3,%xmm0
addss  %xmm1,%xmm0
ucomiss 0xaba(%rip),%xmm0
jb     1560 <yil_cone+0x430>
sqrtss %xmm0,%xmm0
jmp    15ab <yil_cone+0x47b>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  %xmm15,0x3c(%rsp)
movss  %xmm8,0x10(%rsp)
movaps %xmm3,0x40(%rsp)
movaps %xmm6,0xd0(%rsp)
movaps %xmm7,0xc0(%rsp)
call   1040 <sqrtf@plt>
movaps 0xc0(%rsp),%xmm7
movaps 0xd0(%rsp),%xmm6
movaps 0x40(%rsp),%xmm3
movss  0x10(%rsp),%xmm8
movss  0x3c(%rsp),%xmm15
mov    0x68(%rsp),%r10
movss  0x70(%rsp),%xmm9
divss  %xmm0,%xmm6
divss  %xmm0,%xmm3
ucomiss 0xa3e(%rip),%xmm6
ja     15d0 <yil_cone+0x4a0>
movaps %xmm6,%xmm1
jmp    15e0 <yil_cone+0x4b0>
nopl   (%rax)
movaps %xmm6,%xmm1
movaps 0xa36(%rip),%xmm2
xorps  %xmm2,%xmm1
xorps  %xmm2,%xmm3
movslq 0x20(%rsp),%rax
cmp    %rax,%r12
jl     12a4 <yil_cone+0x174>
divss  %xmm0,%xmm7
movaps %xmm7,%xmm2
xorps  0xa14(%rip),%xmm2
xorps  %xmm0,%xmm0
cmpltss %xmm6,%xmm0
andps  %xmm0,%xmm2
andnps %xmm7,%xmm0
mov    %r15,%rcx
or     $0xd,%rcx
lea    0x4(%rax),%rbx
cmp    %rbx,%rcx
cmovle %rbx,%rcx
orps   %xmm2,%xmm0
mov    %rax,%rsi
not    %rsi
add    %rsi,%rcx
cmp    $0xc,%rcx
jb     17b0 <yil_cone+0x680>
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %rcx,%r8
and    $0xfffffffffffffffc,%r8
movaps %xmm0,%xmm2
shufps $0x0,%xmm0,%xmm2
movaps %xmm1,%xmm4
shufps $0x0,%xmm1,%xmm4
movaps %xmm3,0x40(%rsp)
shufps $0x0,%xmm3,%xmm3
lea    -0x4(%r8),%rdx
mov    %rdx,%r9
shr    $0x2,%r9
add    $0x1,%r9
xorps  %xmm5,%xmm5
movlhps %xmm3,%xmm5
movaps %xmm2,%xmm12
unpcklps %xmm4,%xmm12
xorps  %xmm7,%xmm7
shufps $0xd4,%xmm3,%xmm7
movaps %xmm4,%xmm13
shufps $0x11,%xmm2,%xmm13
xorps  %xmm10,%xmm10
shufps $0x23,%xmm3,%xmm10
movaps %xmm2,%xmm14
unpckhps %xmm4,%xmm14
xorps  %xmm11,%xmm11
shufps $0xf4,%xmm3,%xmm11
shufps $0x33,%xmm2,%xmm4
test   %rdx,%rdx
movss  %xmm8,0x10(%rsp)
movaps %xmm5,0x70(%rsp)
je     174f <yil_cone+0x61f>
movaps %xmm4,%xmm2
shufps $0x22,%xmm11,%xmm2
movaps %xmm14,%xmm6
shufps $0x24,%xmm10,%xmm6
movaps %xmm5,%xmm8
movaps %xmm13,%xmm5
shufps $0x22,%xmm7,%xmm5
movaps %xmm12,%xmm3
shufps $0x24,%xmm8,%xmm3
mov    0xb0(%rsp),%rdx
add    %rax,%rdx
mov    0xa8(%rsp),%rdi
lea    (%rdi,%rdx,4),%rdx
cmp    %rbx,%r10
cmovg  %r10,%rbx
add    %rbx,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
and    $0xfffffffffffffffc,%rsi
add    $0xfffffffffffffffc,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %ebx,%ebx
nopl   (%rax)
movups %xmm3,-0x40(%rdx)
movups %xmm5,-0x30(%rdx)
movups %xmm6,-0x20(%rdx)
movups %xmm2,-0x10(%rdx)
movups %xmm3,(%rdx)
movups %xmm5,0x10(%rdx)
movups %xmm6,0x20(%rdx)
movups %xmm2,0x30(%rdx)
add    $0x8,%rbx
sub    $0xffffffffffffff80,%rdx
add    $0xfffffffffffffffe,%rsi
jne    1720 <yil_cone+0x5f0>
jmp    1751 <yil_cone+0x621>
xor    %ebx,%ebx
test   $0x1,%r9b
movss  0x10(%rsp),%xmm8
je     1798 <yil_cone+0x668>
lea    (%rax,%rbx,4),%rdx
add    0x60(%rsp),%rdx
shufps $0x24,0x70(%rsp),%xmm12
shufps $0x22,%xmm7,%xmm13
shufps $0x24,%xmm10,%xmm14
shufps $0x22,%xmm11,%xmm4
mov    0x58(%rsp),%rsi
movups %xmm4,0x30(%rsi,%rdx,4)
movups %xmm14,0x20(%rsi,%rdx,4)
movups %xmm13,0x10(%rsi,%rdx,4)
movups %xmm12,(%rsi,%rdx,4)
lea    (%rax,%r8,4),%rax
cmp    %r8,%rcx
movaps 0x40(%rsp),%xmm3
je     12a0 <yil_cone+0x170>
nopw   0x0(%rax,%rax,1)
movss  %xmm0,-0xc(%r14,%rax,4)
movss  %xmm1,-0x8(%r14,%rax,4)
movss  %xmm3,-0x4(%r14,%rax,4)
movl   $0x0,(%r14,%rax,4)
add    $0x4,%rax
cmp    %r12,%rax
jle    17b0 <yil_cone+0x680>
jmp    12a0 <yil_cone+0x170>
add    $0xe8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @yil_cone(float* %0, i32 %1, i32 %2, i32 %3, float* %4) {
%6 = alloca float*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca float*
%11 = alloca i32
%12 = alloca float
%13 = alloca float
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca float
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca [4 x float]
%25 = alloca [4 x float]
%26 = alloca [4 x float]
%27 = alloca float
store float* %0, float** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store float* %4, float** %10
%28 = load i32, i32* %8
%29 = icmp slt i32 %28, 4
br i1 %29, label %30, label %31
30: ; preds = %5
br label %459
31: ; preds = %5
%32 = load i32, i32* %8
%33 = mul nsw i32 %32, 4
%34 = load i32, i32* %9
%35 = mul nsw i32 %33, %34
store i32 %35, i32* %11
%36 = load i32, i32* %7
%37 = load i32, i32* %11
%38 = icmp slt i32 %36, %37
br i1 %38, label %39, label %40
39: ; preds = %31
br label %459
40: ; preds = %31
store float 1.000000e+00, float* %12
%41 = load i32, i32* %9
%42 = sitofp i32 %41 to float
%43 = fdiv float 1.000000e+00, %42
store float %43, float* %13
store i32 0, i32* %16
br label %44
44: ; preds = %456, %40
%45 = load i32, i32* %16
%46 = load i32, i32* %9
%47 = icmp slt i32 %45, %46
br i1 %47, label %48, label %459
48: ; preds = %44
store float 1.000000e+00, float* %17
store float 0.000000e+00, float* %18
%49 = load i32, i32* %8
%50 = sitofp i32 %49 to double
%51 = fdiv double 0x401921FB54442D11, %50
%52 = fptrunc double %51 to float
store float %52, float* %19
%53 = load float, float* %19
store float %53, float* %20
store i32 0, i32* %21
store i32 0, i32* %22
br label %54
54: ; preds = %446, %48
%55 = load i32, i32* %22
%56 = load i32, i32* %8
%57 = mul nsw i32 %56, 16
%58 = icmp slt i32 %55, %57
br i1 %58, label %59, label %452
59: ; preds = %54
%60 = load i32, i32* %16
%61 = mul nsw i32 %60, 16
%62 = load i32, i32* %8
%63 = mul nsw i32 %61, %62
store i32 %63, i32* %23
%64 = load float, float* %12
%65 = load float, float* %17
%66 = fmul float %64, %65
%67 = load float*, float** %6
%68 = load i32, i32* %23
%69 = load i32, i32* %22
%70 = add nsw i32 %68, %69
%71 = add nsw i32 %70, 0
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds float, float* %67, i64 %72
store float %66, float* %73
%74 = load i32, i32* %16
%75 = sitofp i32 %74 to float
%76 = load float*, float** %6
%77 = load i32, i32* %23
%78 = load i32, i32* %22
%79 = add nsw i32 %77, %78
%80 = add nsw i32 %79, 1
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds float, float* %76, i64 %81
store float %75, float* %82
%83 = load float, float* %12
%84 = load float, float* %18
%85 = fmul float %83, %84
%86 = load float*, float** %6
%87 = load i32, i32* %23
%88 = load i32, i32* %22
%89 = add nsw i32 %87, %88
%90 = add nsw i32 %89, 2
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds float, float* %86, i64 %91
store float %85, float* %92
%93 = load float*, float** %6
%94 = load i32, i32* %23
%95 = load i32, i32* %22
%96 = add nsw i32 %94, %95
%97 = add nsw i32 %96, 3
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds float, float* %93, i64 %98
store float 1.000000e+00, float* %99
%100 = load i32, i32* %22
store i32 %100, i32* %14
%101 = load i32, i32* %22
%102 = add nsw i32 %101, 4
store i32 %102, i32* %22
%103 = load float, float* %13
%104 = load float, float* %12
%105 = fsub float %104, %103
store float %105, float* %12
%106 = load float, float* %12
%107 = load float, float* %17
%108 = fmul float %106, %107
%109 = load float*, float** %6
%110 = load i32, i32* %23
%111 = load i32, i32* %22
%112 = add nsw i32 %110, %111
%113 = add nsw i32 %112, 0
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds float, float* %109, i64 %114
store float %108, float* %115
%116 = load i32, i32* %16
%117 = add nsw i32 %116, 1
%118 = sitofp i32 %117 to float
%119 = load float*, float** %6
%120 = load i32, i32* %23
%121 = load i32, i32* %22
%122 = add nsw i32 %120, %121
%123 = add nsw i32 %122, 1
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds float, float* %119, i64 %124
store float %118, float* %125
%126 = load float, float* %12
%127 = load float, float* %18
%128 = fmul float %126, %127
%129 = load float*, float** %6
%130 = load i32, i32* %23
%131 = load i32, i32* %22
%132 = add nsw i32 %130, %131
%133 = add nsw i32 %132, 2
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds float, float* %129, i64 %134
store float %128, float* %135
%136 = load float*, float** %6
%137 = load i32, i32* %23
%138 = load i32, i32* %22
%139 = add nsw i32 %137, %138
%140 = add nsw i32 %139, 3
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds float, float* %136, i64 %141
store float 1.000000e+00, float* %142
%143 = load i32, i32* %22
store i32 %143, i32* %15
%144 = load i32, i32* %22
%145 = add nsw i32 %144, 4
store i32 %145, i32* %22
%146 = load float, float* %20
%147 = fpext float %146 to double
%148 = call double @sin(double %147)
%149 = fptrunc double %148 to float
store float %149, float* %18
%150 = load float, float* %20
%151 = fpext float %150 to double
%152 = call double @cos(double %151)
%153 = fptrunc double %152 to float
store float %153, float* %17
%154 = load float, float* %12
%155 = load float, float* %17
%156 = fmul float %154, %155
%157 = load float*, float** %6
%158 = load i32, i32* %23
%159 = load i32, i32* %22
%160 = add nsw i32 %158, %159
%161 = add nsw i32 %160, 0
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds float, float* %157, i64 %162
store float %156, float* %163
%164 = load i32, i32* %16
%165 = add nsw i32 %164, 1
%166 = sitofp i32 %165 to float
%167 = load float*, float** %6
%168 = load i32, i32* %23
%169 = load i32, i32* %22
%170 = add nsw i32 %168, %169
%171 = add nsw i32 %170, 1
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds float, float* %167, i64 %172
store float %166, float* %173
%174 = load float, float* %12
%175 = load float, float* %18
%176 = fmul float %174, %175
%177 = load float*, float** %6
%178 = load i32, i32* %23
%179 = load i32, i32* %22
%180 = add nsw i32 %178, %179
%181 = add nsw i32 %180, 2
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds float, float* %177, i64 %182
store float %176, float* %183
%184 = load float*, float** %6
%185 = load i32, i32* %23
%186 = load i32, i32* %22
%187 = add nsw i32 %185, %186
%188 = add nsw i32 %187, 3
%189 = sext i32 %188 to i64
%190 = getelementptr inbounds float, float* %184, i64 %189
store float 1.000000e+00, float* %190
%191 = load i32, i32* %22
%192 = add nsw i32 %191, 4
store i32 %192, i32* %22
%193 = load float, float* %13
%194 = load float, float* %12
%195 = fadd float %194, %193
store float %195, float* %12
%196 = load float, float* %12
%197 = load float, float* %17
%198 = fmul float %196, %197
%199 = load float*, float** %6
%200 = load i32, i32* %23
%201 = load i32, i32* %22
%202 = add nsw i32 %200, %201
%203 = add nsw i32 %202, 0
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds float, float* %199, i64 %204
store float %198, float* %205
%206 = load i32, i32* %16
%207 = sitofp i32 %206 to float
%208 = load float*, float** %6
%209 = load i32, i32* %23
%210 = load i32, i32* %22
%211 = add nsw i32 %209, %210
%212 = add nsw i32 %211, 1
%213 = sext i32 %212 to i64
%214 = getelementptr inbounds float, float* %208, i64 %213
store float %207, float* %214
%215 = load float, float* %12
%216 = load float, float* %18
%217 = fmul float %215, %216
%218 = load float*, float** %6
%219 = load i32, i32* %23
%220 = load i32, i32* %22
%221 = add nsw i32 %219, %220
%222 = add nsw i32 %221, 2
%223 = sext i32 %222 to i64
%224 = getelementptr inbounds float, float* %218, i64 %223
store float %217, float* %224
%225 = load float*, float** %6
%226 = load i32, i32* %23
%227 = load i32, i32* %22
%228 = add nsw i32 %226, %227
%229 = add nsw i32 %228, 3
%230 = sext i32 %229 to i64
%231 = getelementptr inbounds float, float* %225, i64 %230
store float 1.000000e+00, float* %231
%232 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 0
%233 = load float*, float** %6
%234 = load i32, i32* %15
%235 = add nsw i32 %234, 0
%236 = sext i32 %235 to i64
%237 = getelementptr inbounds float, float* %233, i64 %236
%238 = load float, float* %237
%239 = load float*, float** %6
%240 = load i32, i32* %14
%241 = add nsw i32 %240, 0
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds float, float* %239, i64 %242
%244 = load float, float* %243
%245 = fsub float %238, %244
store float %245, float* %232
%246 = getelementptr inbounds float, float* %232, i64 1
%247 = load float*, float** %6
%248 = load i32, i32* %15
%249 = add nsw i32 %248, 1
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds float, float* %247, i64 %250
%252 = load float, float* %251
%253 = load float*, float** %6
%254 = load i32, i32* %14
%255 = add nsw i32 %254, 1
%256 = sext i32 %255 to i64
%257 = getelementptr inbounds float, float* %253, i64 %256
%258 = load float, float* %257
%259 = fsub float %252, %258
store float %259, float* %246
%260 = getelementptr inbounds float, float* %246, i64 1
%261 = load float*, float** %6
%262 = load i32, i32* %15
%263 = add nsw i32 %262, 2
%264 = sext i32 %263 to i64
%265 = getelementptr inbounds float, float* %261, i64 %264
%266 = load float, float* %265
%267 = load float*, float** %6
%268 = load i32, i32* %14
%269 = add nsw i32 %268, 2
%270 = sext i32 %269 to i64
%271 = getelementptr inbounds float, float* %267, i64 %270
%272 = load float, float* %271
%273 = fsub float %266, %272
store float %273, float* %260
%274 = getelementptr inbounds float, float* %260, i64 1
store float 0.000000e+00, float* %274
%275 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 0
%276 = load float*, float** %6
%277 = load i32, i32* %22
%278 = add nsw i32 %277, 0
%279 = sext i32 %278 to i64
%280 = getelementptr inbounds float, float* %276, i64 %279
%281 = load float, float* %280
%282 = load float*, float** %6
%283 = load i32, i32* %14
%284 = add nsw i32 %283, 0
%285 = sext i32 %284 to i64
%286 = getelementptr inbounds float, float* %282, i64 %285
%287 = load float, float* %286
%288 = fsub float %281, %287
store float %288, float* %275
%289 = getelementptr inbounds float, float* %275, i64 1
%290 = load float*, float** %6
%291 = load i32, i32* %22
%292 = add nsw i32 %291, 1
%293 = sext i32 %292 to i64
%294 = getelementptr inbounds float, float* %290, i64 %293
%295 = load float, float* %294
%296 = load float*, float** %6
%297 = load i32, i32* %14
%298 = add nsw i32 %297, 1
%299 = sext i32 %298 to i64
%300 = getelementptr inbounds float, float* %296, i64 %299
%301 = load float, float* %300
%302 = fsub float %295, %301
store float %302, float* %289
%303 = getelementptr inbounds float, float* %289, i64 1
%304 = load float*, float** %6
%305 = load i32, i32* %22
%306 = add nsw i32 %305, 2
%307 = sext i32 %306 to i64
%308 = getelementptr inbounds float, float* %304, i64 %307
%309 = load float, float* %308
%310 = load float*, float** %6
%311 = load i32, i32* %14
%312 = add nsw i32 %311, 2
%313 = sext i32 %312 to i64
%314 = getelementptr inbounds float, float* %310, i64 %313
%315 = load float, float* %314
%316 = fsub float %309, %315
store float %316, float* %303
%317 = getelementptr inbounds float, float* %303, i64 1
store float 0.000000e+00, float* %317
%318 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
%319 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 1
%320 = load float, float* %319
%321 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 2
%322 = load float, float* %321
%323 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 2
%324 = load float, float* %323
%325 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 1
%326 = load float, float* %325
%327 = fmul float %324, %326
%328 = fneg float %327
%329 = call float @llvm.fmuladd.f32(float %320, float %322, float %328)
store float %329, float* %318
%330 = getelementptr inbounds float, float* %318, i64 1
%331 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 2
%332 = load float, float* %331
%333 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 0
%334 = load float, float* %333
%335 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 0
%336 = load float, float* %335
%337 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 2
%338 = load float, float* %337
%339 = fmul float %336, %338
%340 = fneg float %339
%341 = call float @llvm.fmuladd.f32(float %332, float %334, float %340)
store float %341, float* %330
%342 = getelementptr inbounds float, float* %330, i64 1
%343 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 0
%344 = load float, float* %343
%345 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 1
%346 = load float, float* %345
%347 = getelementptr inbounds [4 x float], [4 x float]* %24, i64 0, i64 1
%348 = load float, float* %347
%349 = getelementptr inbounds [4 x float], [4 x float]* %25, i64 0, i64 0
%350 = load float, float* %349
%351 = fmul float %348, %350
%352 = fneg float %351
%353 = call float @llvm.fmuladd.f32(float %344, float %346, float %352)
store float %353, float* %342
%354 = getelementptr inbounds float, float* %342, i64 1
store float 0.000000e+00, float* %354
%355 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
%356 = load float, float* %355
%357 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
%358 = load float, float* %357
%359 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
%360 = load float, float* %359
%361 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
%362 = load float, float* %361
%363 = fmul float %360, %362
%364 = call float @llvm.fmuladd.f32(float %356, float %358, float %363)
%365 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 2
%366 = load float, float* %365
%367 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 2
%368 = load float, float* %367
%369 = call float @llvm.fmuladd.f32(float %366, float %368, float %364)
%370 = fpext float %369 to double
%371 = call double @sqrt(double %370)
%372 = fptrunc double %371 to float
store float %372, float* %27
%373 = load float, float* %27
%374 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
%375 = load float, float* %374
%376 = fdiv float %375, %373
store float %376, float* %374
%377 = load float, float* %27
%378 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
%379 = load float, float* %378
%380 = fdiv float %379, %377
store float %380, float* %378
%381 = load float, float* %27
%382 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 2
%383 = load float, float* %382
%384 = fdiv float %383, %381
store float %384, float* %382
%385 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
%386 = load float, float* %385
%387 = fcmp ogt float %386, 0.000000e+00
br i1 %387, label %388, label %401
388: ; preds = %59
%389 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
%390 = load float, float* %389
%391 = fneg float %390
%392 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
store float %391, float* %392
%393 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
%394 = load float, float* %393
%395 = fneg float %394
%396 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
store float %395, float* %396
%397 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 2
%398 = load float, float* %397
%399 = fneg float %398
%400 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 2
store float %399, float* %400
br label %401
401: ; preds = %388, %59
br label %402
402: ; preds = %443, %401
%403 = load i32, i32* %21
%404 = load i32, i32* %22
%405 = icmp sle i32 %403, %404
br i1 %405, label %406, label %446
406: ; preds = %402
%407 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 0
%408 = load float, float* %407
%409 = load float*, float** %10
%410 = load i32, i32* %23
%411 = load i32, i32* %21
%412 = add nsw i32 %410, %411
%413 = add nsw i32 %412, 0
%414 = sext i32 %413 to i64
%415 = getelementptr inbounds float, float* %409, i64 %414
store float %408, float* %415
%416 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 1
%417 = load float, float* %416
%418 = load float*, float** %10
%419 = load i32, i32* %23
%420 = load i32, i32* %21
%421 = add nsw i32 %419, %420
%422 = add nsw i32 %421, 1
%423 = sext i32 %422 to i64
%424 = getelementptr inbounds float, float* %418, i64 %423
store float %417, float* %424
%425 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 2
%426 = load float, float* %425
%427 = load float*, float** %10
%428 = load i32, i32* %23
%429 = load i32, i32* %21
%430 = add nsw i32 %428, %429
%431 = add nsw i32 %430, 2
%432 = sext i32 %431 to i64
%433 = getelementptr inbounds float, float* %427, i64 %432
store float %426, float* %433
%434 = getelementptr inbounds [4 x float], [4 x float]* %26, i64 0, i64 3
%435 = load float, float* %434
%436 = load float*, float** %10
%437 = load i32, i32* %23
%438 = load i32, i32* %21
%439 = add nsw i32 %437, %438
%440 = add nsw i32 %439, 3
%441 = sext i32 %440 to i64
%442 = getelementptr inbounds float, float* %436, i64 %441
store float %435, float* %442
br label %443
443: ; preds = %406
%444 = load i32, i32* %21
%445 = add nsw i32 %444, 4
store i32 %445, i32* %21
br label %402
446: ; preds = %402
%447 = load i32, i32* %22
%448 = add nsw i32 %447, 4
store i32 %448, i32* %22
%449 = load float, float* %19
%450 = load float, float* %20
%451 = fadd float %450, %449
store float %451, float* %20
br label %54
452: ; preds = %54
%453 = load float, float* %13
%454 = load float, float* %12
%455 = fsub float %454, %453
store float %455, float* %12
br label %456
456: ; preds = %452
%457 = load i32, i32* %16
%458 = add nsw i32 %457, 1
store i32 %458, i32* %16
br label %44
459: ; preds = %30, %39, %44
ret void
}

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