void BarycentricCoordinatesTetrahedron(double *p1, double *p2, double *p3,
                                       double *p4, double rx, double ry,
                                       double rz, double *Lambda) {
  int i;
  double rt[3];
  double r1[3], r2[3], r3[3];
  double r4[3], r5[3], r6[3];
  double g1[3], g2[3], g3[3], g4[3];
  double c1, c2, c3, c4;
  double r_b[3];
  double r[3];
  double J;
  for (i = 0; i < 3; i++) {
    r1[i] = p2[i] - p1[i];
    r2[i] = p3[i] - p1[i];
    r3[i] = p4[i] - p1[i];
    r4[i] = p3[i] - p2[i];
    r5[i] = p2[i] - p4[i];
    r6[i] = p4[i] - p3[i];
  }
  cross(r1, r2, rt);
  J = rt[0] * r3[0] + rt[1] * r3[1] + rt[2] * r3[2];
  cross(r4, r5, rt);
  g1[0] = rt[0] / J;
  g1[1] = rt[1] / J;
  g1[2] = rt[2] / J;
  cross(r2, r3, rt);
  g2[0] = rt[0] / J;
  g2[1] = rt[1] / J;
  g2[2] = rt[2] / J;
  cross(r3, r1, rt);
  g3[0] = rt[0] / J;
  g3[1] = rt[1] / J;
  g3[2] = rt[2] / J;
  cross(r1, r2, rt);
  g4[0] = rt[0] / J;
  g4[1] = rt[1] / J;
  g4[2] = rt[2] / J;
  for (i = 0; i < 3; i++) {
    r_b[i] = -(p1[i] + p2[i] + p3[i] + p4[i]) / 4.0;
  }
  c1 = (r_b[0] * g1[0] + r_b[1] * g1[1] + r_b[2] * g1[2]) + 1 / 4.0;
  c2 = (r_b[0] * g2[0] + r_b[1] * g2[1] + r_b[2] * g2[2]) + 1 / 4.0;
  c3 = (r_b[0] * g3[0] + r_b[1] * g3[1] + r_b[2] * g3[2]) + 1 / 4.0;
  c4 = (r_b[0] * g4[0] + r_b[1] * g4[1] + r_b[2] * g4[2]) + 1 / 4.0;
  r[0] = rx;
  r[1] = ry;
  r[2] = rz;
  Lambda[0] = r[0] * g1[0] + r[1] * g1[1] + r[2] * g1[2] + c1;
  Lambda[1] = r[0] * g2[0] + r[1] * g2[1] + r[2] * g2[2] + c2;
  Lambda[2] = r[0] * g3[0] + r[1] * g3[1] + r[2] * g3[2] + c3;
  Lambda[3] = r[0] * g4[0] + r[1] * g4[1] + r[2] * g4[2] + c4;
}


x86 assembly (clang, -O0):
<BarycentricCoordinatesTetrahedron>:
push   %rbp
mov    %rsp,%rbp
sub    $0x210,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movsd  %xmm0,-0x28(%rbp)
movsd  %xmm1,-0x30(%rbp)
movsd  %xmm2,-0x38(%rbp)
mov    %r8,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
cmpl   $0x3,-0x44(%rbp)
jge    1244 <BarycentricCoordinatesTetrahedron+0x134>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0x80(%rbp,%rax,8)
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0xa0(%rbp,%rax,8)
ff ff
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0xc0(%rbp,%rax,8)
ff ff
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0xe0(%rbp,%rax,8)
ff ff
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0x100(%rbp,%rax,8)
ff ff
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0x120(%rbp,%rax,8)
ff ff
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1145 <BarycentricCoordinatesTetrahedron+0x35>
lea    -0x80(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
lea    -0x60(%rbp),%rdx
mov    $0x0,%al
call   1030 <cross@plt>
movsd  -0x60(%rbp),%xmm1
movsd  -0xc0(%rbp),%xmm2
ff
movsd  -0x58(%rbp),%xmm0
mulsd  -0xb8(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x50(%rbp),%xmm0
movsd  -0xb0(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x208(%rbp)
ff
lea    -0xe0(%rbp),%rdi
lea    -0x100(%rbp),%rsi
lea    -0x60(%rbp),%rdx
mov    $0x0,%al
call   1030 <cross@plt>
movsd  -0x60(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x140(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x138(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x130(%rbp)
ff
lea    -0xa0(%rbp),%rdi
lea    -0xc0(%rbp),%rsi
lea    -0x60(%rbp),%rdx
mov    $0x0,%al
call   1030 <cross@plt>
movsd  -0x60(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x160(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x158(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x150(%rbp)
ff
lea    -0xc0(%rbp),%rdi
lea    -0x80(%rbp),%rsi
lea    -0x60(%rbp),%rdx
mov    $0x0,%al
call   1030 <cross@plt>
movsd  -0x60(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x180(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x178(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x170(%rbp)
ff
lea    -0x80(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
lea    -0x60(%rbp),%rdx
mov    $0x0,%al
call   1030 <cross@plt>
movsd  -0x60(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x1a0(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x198(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
divsd  -0x208(%rbp),%xmm0
ff
movsd  %xmm0,-0x190(%rbp)
ff
movl   $0x0,-0x44(%rbp)
cmpl   $0x3,-0x44(%rbp)
jge    1476 <BarycentricCoordinatesTetrahedron+0x366>
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xbb1(%rip),%xmm1
divsd  %xmm1,%xmm0
movslq -0x44(%rbp),%rax
movsd  %xmm0,-0x1e0(%rbp,%rax,8)
ff ff
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    13fa <BarycentricCoordinatesTetrahedron+0x2ea>
movsd  -0x1e0(%rbp),%xmm1
ff
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x1d8(%rbp),%xmm0
ff
mulsd  -0x138(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1d0(%rbp),%xmm0
ff
movsd  -0x130(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xb42(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1a8(%rbp)
ff
movsd  -0x1e0(%rbp),%xmm1
ff
movsd  -0x160(%rbp),%xmm2
ff
movsd  -0x1d8(%rbp),%xmm0
ff
mulsd  -0x158(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1d0(%rbp),%xmm0
ff
movsd  -0x150(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xaee(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1b0(%rbp)
ff
movsd  -0x1e0(%rbp),%xmm1
ff
movsd  -0x180(%rbp),%xmm2
ff
movsd  -0x1d8(%rbp),%xmm0
ff
mulsd  -0x178(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1d0(%rbp),%xmm0
ff
movsd  -0x170(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xa9a(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1b8(%rbp)
ff
movsd  -0x1e0(%rbp),%xmm1
ff
movsd  -0x1a0(%rbp),%xmm2
ff
movsd  -0x1d8(%rbp),%xmm0
ff
mulsd  -0x198(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1d0(%rbp),%xmm0
ff
movsd  -0x190(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xa46(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x1c0(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x200(%rbp)
ff
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x1f8(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x1f0(%rbp)
ff
movsd  -0x200(%rbp),%xmm1
ff
movsd  -0x140(%rbp),%xmm2
ff
movsd  -0x1f8(%rbp),%xmm0
ff
mulsd  -0x138(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1f0(%rbp),%xmm0
ff
movsd  -0x130(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x1a8(%rbp),%xmm0
ff
mov    -0x40(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x200(%rbp),%xmm1
ff
movsd  -0x160(%rbp),%xmm2
ff
movsd  -0x1f8(%rbp),%xmm0
ff
mulsd  -0x158(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1f0(%rbp),%xmm0
ff
movsd  -0x150(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x1b0(%rbp),%xmm0
ff
mov    -0x40(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x200(%rbp),%xmm1
ff
movsd  -0x180(%rbp),%xmm2
ff
movsd  -0x1f8(%rbp),%xmm0
ff
mulsd  -0x178(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1f0(%rbp),%xmm0
ff
movsd  -0x170(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x1b8(%rbp),%xmm0
ff
mov    -0x40(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x200(%rbp),%xmm1
ff
movsd  -0x1a0(%rbp),%xmm2
ff
movsd  -0x1f8(%rbp),%xmm0
ff
mulsd  -0x198(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x1f0(%rbp),%xmm0
ff
movsd  -0x190(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x1c0(%rbp),%xmm0
ff
mov    -0x40(%rbp),%rax
movsd  %xmm0,0x18(%rax)
add    $0x210,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<BarycentricCoordinatesTetrahedron>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x178,%rsp
mov    %r8,0x78(%rsp)
movaps %xmm2,0x110(%rsp)
movaps %xmm1,0xf0(%rsp)
movaps %xmm0,0x100(%rsp)
mov    %rcx,%r15
mov    %rdx,%r12
mov    %rsi,%r13
mov    %rdi,%rbx
movupd (%rdi),%xmm0
movupd (%rsi),%xmm1
movupd (%rdx),%xmm2
movupd (%rcx),%xmm3
movapd %xmm1,%xmm4
subpd  %xmm0,%xmm4
movapd %xmm4,0xa0(%rsp)
movapd %xmm2,%xmm4
subpd  %xmm0,%xmm4
movapd %xmm4,0x80(%rsp)
subpd  %xmm1,%xmm2
subpd  %xmm3,%xmm1
subpd  %xmm0,%xmm3
movapd %xmm3,0x50(%rsp)
movapd %xmm3,0x160(%rsp)
movapd %xmm2,0x140(%rsp)
movapd %xmm1,0x120(%rsp)
movsd  0x10(%rsi),%xmm0
movsd  0x10(%rdi),%xmm1
movapd %xmm0,%xmm2
subsd  %xmm1,%xmm2
movsd  %xmm2,0xb0(%rsp)
movsd  0x10(%rdx),%xmm2
movapd %xmm2,%xmm3
subsd  %xmm1,%xmm3
movsd  %xmm3,0x90(%rsp)
movsd  0x10(%rcx),%xmm3
subsd  %xmm0,%xmm2
subsd  %xmm3,%xmm0
subsd  %xmm1,%xmm3
movapd %xmm3,0x60(%rsp)
movsd  %xmm3,0x170(%rsp)
movsd  %xmm2,0x150(%rsp)
movsd  %xmm0,0x130(%rsp)
lea    0xa0(%rsp),%rdi
lea    0x80(%rsp),%rsi
mov    %rsp,%r14
mov    %r14,%rdx
xor    %eax,%eax
call   1030 <cross@plt>
movapd 0x50(%rsp),%xmm1
movapd %xmm1,%xmm0
unpckhpd %xmm1,%xmm0
mulsd  0x8(%rsp),%xmm0
mulsd  (%rsp),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,0x50(%rsp)
movapd 0x60(%rsp),%xmm0
mulsd  0x10(%rsp),%xmm0
movapd %xmm0,0x60(%rsp)
lea    0x140(%rsp),%rdi
lea    0x120(%rsp),%rsi
mov    %r14,%rdx
xor    %eax,%eax
call   1030 <cross@plt>
movaps (%rsp),%xmm0
movaps %xmm0,0x20(%rsp)
movups 0x8(%rsp),%xmm0
movaps %xmm0,0x30(%rsp)
movsd  0x10(%rsp),%xmm0
movaps %xmm0,0x40(%rsp)
lea    0x160(%rsp),%rbp
lea    0x80(%rsp),%rdi
mov    %rbp,%rsi
mov    %r14,%rdx
xor    %eax,%eax
call   1030 <cross@plt>
movaps 0x20(%rsp),%xmm0
movhps (%rsp),%xmm0
movaps %xmm0,0x20(%rsp)
movaps 0x30(%rsp),%xmm0
movhps 0x8(%rsp),%xmm0
movaps %xmm0,0x30(%rsp)
movaps 0x40(%rsp),%xmm0
movhps 0x10(%rsp),%xmm0
movaps %xmm0,0x40(%rsp)
mov    %rbp,%rdi
lea    0xa0(%rsp),%rsi
mov    %r14,%rdx
xor    %eax,%eax
call   1030 <cross@plt>
movaps (%rsp),%xmm0
movaps %xmm0,0xc0(%rsp)
movups 0x8(%rsp),%xmm0
movaps %xmm0,0xd0(%rsp)
movsd  0x10(%rsp),%xmm0
movaps %xmm0,0xe0(%rsp)
lea    0xa0(%rsp),%rdi
lea    0x80(%rsp),%rsi
mov    %r14,%rdx
xor    %eax,%eax
call   1030 <cross@plt>
movsd  (%rbx),%xmm1
movsd  0x8(%rbx),%xmm2
addsd  0x0(%r13),%xmm1
addsd  (%r12),%xmm1
addsd  (%r15),%xmm1
movsd  0xca9(%rip),%xmm3
mulsd  %xmm3,%xmm1
addsd  0x8(%r13),%xmm2
addsd  0x8(%r12),%xmm2
addsd  0x8(%r15),%xmm2
mulsd  %xmm3,%xmm2
movsd  0x10(%rbx),%xmm0
addsd  0x10(%r13),%xmm0
addsd  0x10(%r12),%xmm0
addsd  0x10(%r15),%xmm0
mulsd  %xmm3,%xmm0
movapd 0x60(%rsp),%xmm3
addsd  0x50(%rsp),%xmm3
unpcklpd %xmm3,%xmm3
movapd 0x20(%rsp),%xmm6
divpd  %xmm3,%xmm6
movapd 0x30(%rsp),%xmm4
divpd  %xmm3,%xmm4
movapd 0x40(%rsp),%xmm5
divpd  %xmm3,%xmm5
movapd 0xc0(%rsp),%xmm9
movhpd (%rsp),%xmm9
divpd  %xmm3,%xmm9
movapd 0xd0(%rsp),%xmm10
movhpd 0x8(%rsp),%xmm10
divpd  %xmm3,%xmm10
movapd 0xe0(%rsp),%xmm8
movhpd 0x10(%rsp),%xmm8
divpd  %xmm3,%xmm8
unpcklpd %xmm2,%xmm2
movapd %xmm4,%xmm3
movapd %xmm4,%xmm7
mulpd  %xmm2,%xmm3
unpcklpd %xmm1,%xmm1
movapd %xmm1,%xmm4
mulpd  %xmm6,%xmm4
addpd  %xmm3,%xmm4
unpcklpd %xmm0,%xmm0
movapd %xmm0,%xmm3
mulpd  %xmm5,%xmm3
addpd  %xmm4,%xmm3
movapd 0xbdb(%rip),%xmm4
addpd  %xmm4,%xmm3
mulpd  %xmm10,%xmm2
mulpd  %xmm9,%xmm1
addpd  %xmm2,%xmm1
mulpd  %xmm8,%xmm0
addpd  %xmm1,%xmm0
addpd  %xmm4,%xmm0
movapd 0xf0(%rsp),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm7
movapd %xmm1,%xmm4
movapd 0x100(%rsp),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm6
movapd %xmm1,%xmm2
addpd  %xmm7,%xmm6
movapd 0x110(%rsp),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm5
addpd  %xmm6,%xmm5
addpd  %xmm3,%xmm5
mov    0x78(%rsp),%rax
movupd %xmm5,(%rax)
mulpd  %xmm10,%xmm4
mulpd  %xmm9,%xmm2
addpd  %xmm4,%xmm2
mulpd  %xmm8,%xmm1
addpd  %xmm2,%xmm1
addpd  %xmm0,%xmm1
movupd %xmm1,0x10(%rax)
add    $0x178,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @BarycentricCoordinatesTetrahedron(double* nocapture %0, double* nocapture %1, double* nocapture %2, double* nocapture %3, double %4, double %5, double %6, double* nocapture writeonly %7) {
%9 = alloca [3 x double]
%10 = alloca [3 x double]
%11 = alloca [3 x double]
%12 = alloca [3 x double]
%13 = alloca [3 x double]
%14 = alloca [3 x double]
%15 = bitcast [3 x double]* %9 to i8*
%16 = bitcast [3 x double]* %10 to i8*
%17 = bitcast [3 x double]* %11 to i8*
%18 = bitcast [3 x double]* %12 to i8*
%19 = bitcast [3 x double]* %13 to i8*
%20 = bitcast [3 x double]* %14 to i8*
%21 = getelementptr inbounds [3 x double], [3 x double]* %10, i64 0, i64 0
%22 = getelementptr inbounds double, double* %0, i64 1
%23 = bitcast double* %0 to <2 x double>*
%24 = load <2 x double>, <2 x double>* %23
%25 = getelementptr inbounds [3 x double], [3 x double]* %11, i64 0, i64 0
%26 = getelementptr inbounds [3 x double], [3 x double]* %12, i64 0, i64 0
%27 = getelementptr inbounds double, double* %1, i64 1
%28 = bitcast double* %1 to <2 x double>*
%29 = load <2 x double>, <2 x double>* %28
%30 = getelementptr inbounds double, double* %2, i64 1
%31 = bitcast double* %2 to <2 x double>*
%32 = load <2 x double>, <2 x double>* %31
%33 = getelementptr inbounds [3 x double], [3 x double]* %13, i64 0, i64 0
%34 = getelementptr inbounds double, double* %3, i64 1
%35 = bitcast double* %3 to <2 x double>*
%36 = load <2 x double>, <2 x double>* %35
%37 = getelementptr inbounds [3 x double], [3 x double]* %14, i64 0, i64 0
%38 = fsub <2 x double> %29, %24
%39 = bitcast [3 x double]* %10 to <2 x double>*
store <2 x double> %38, <2 x double>* %39
%40 = fsub <2 x double> %32, %24
%41 = bitcast [3 x double]* %11 to <2 x double>*
store <2 x double> %40, <2 x double>* %41
%42 = fsub <2 x double> %36, %24
%43 = bitcast [3 x double]* %12 to <2 x double>*
store <2 x double> %42, <2 x double>* %43
%44 = fsub <2 x double> %32, %29
%45 = bitcast [3 x double]* %13 to <2 x double>*
store <2 x double> %44, <2 x double>* %45
%46 = fsub <2 x double> %29, %36
%47 = bitcast [3 x double]* %14 to <2 x double>*
store <2 x double> %46, <2 x double>* %47
%48 = getelementptr inbounds double, double* %1, i64 2
%49 = load double, double* %48
%50 = getelementptr inbounds double, double* %0, i64 2
%51 = load double, double* %50
%52 = fsub double %49, %51
%53 = getelementptr inbounds [3 x double], [3 x double]* %10, i64 0, i64 2
store double %52, double* %53
%54 = getelementptr inbounds double, double* %2, i64 2
%55 = load double, double* %54
%56 = fsub double %55, %51
%57 = getelementptr inbounds [3 x double], [3 x double]* %11, i64 0, i64 2
store double %56, double* %57
%58 = getelementptr inbounds double, double* %3, i64 2
%59 = load double, double* %58
%60 = fsub double %59, %51
%61 = getelementptr inbounds [3 x double], [3 x double]* %12, i64 0, i64 2
store double %60, double* %61
%62 = fsub double %55, %49
%63 = getelementptr inbounds [3 x double], [3 x double]* %13, i64 0, i64 2
store double %62, double* %63
%64 = fsub double %49, %59
%65 = getelementptr inbounds [3 x double], [3 x double]* %14, i64 0, i64 2
store double %64, double* %65
%66 = getelementptr inbounds [3 x double], [3 x double]* %9, i64 0, i64 0
%67 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @cross to i32 (double*, double*, double*, ...)*)(double* %21, double* %25, double* %66)
%68 = load double, double* %66
%69 = getelementptr inbounds [3 x double], [3 x double]* %9, i64 0, i64 1
%70 = load double, double* %69
%71 = extractelement <2 x double> %42, i64 1
%72 = fmul double %70, %71
%73 = getelementptr inbounds [3 x double], [3 x double]* %9, i64 0, i64 2
%74 = load double, double* %73
%75 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @cross to i32 (double*, double*, double*, ...)*)(double* %33, double* %37, double* %66)
%76 = bitcast [3 x double]* %9 to <2 x double>*
%77 = load <2 x double>, <2 x double>* %76
%78 = bitcast double* %69 to <2 x double>*
%79 = load <2 x double>, <2 x double>* %78
%80 = load double, double* %73
%81 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @cross to i32 (double*, double*, double*, ...)*)(double* %25, double* %26, double* %66)
%82 = load double, double* %66
%83 = load double, double* %69
%84 = load double, double* %73
%85 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @cross to i32 (double*, double*, double*, ...)*)(double* %26, double* %21, double* %66)
%86 = bitcast [3 x double]* %9 to <2 x double>*
%87 = load <2 x double>, <2 x double>* %86
%88 = bitcast double* %69 to <2 x double>*
%89 = load <2 x double>, <2 x double>* %88
%90 = load double, double* %73
%91 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @cross to i32 (double*, double*, double*, ...)*)(double* %21, double* %25, double* %66)
%92 = load double, double* %66
%93 = load double, double* %69
%94 = load double, double* %73
%95 = load double, double* %0
%96 = load double, double* %1
%97 = fadd double %95, %96
%98 = load double, double* %2
%99 = fadd double %97, %98
%100 = load double, double* %3
%101 = fadd double %99, %100
%102 = fmul double %101, -2.500000e-01
%103 = load double, double* %22
%104 = load double, double* %27
%105 = fadd double %103, %104
%106 = load double, double* %30
%107 = fadd double %105, %106
%108 = load double, double* %34
%109 = fadd double %107, %108
%110 = fmul double %109, -2.500000e-01
%111 = load double, double* %50
%112 = load double, double* %48
%113 = fadd double %111, %112
%114 = load double, double* %54
%115 = fadd double %113, %114
%116 = load double, double* %58
%117 = fadd double %115, %116
%118 = fmul double %117, -2.500000e-01
%119 = extractelement <2 x double> %42, i64 0
%120 = call double @llvm.fmuladd.f64(double %68, double %119, double %72)
%121 = call double @llvm.fmuladd.f64(double %74, double %60, double %120)
%122 = insertelement <2 x double> %77, double %82, i64 1
%123 = insertelement <2 x double> poison, double %121, i64 0
%124 = shufflevector <2 x double> %123, <2 x double> poison, <2 x i32> zeroinitializer
%125 = fdiv <2 x double> %122, %124
%126 = insertelement <2 x double> %79, double %83, i64 1
%127 = fdiv <2 x double> %126, %124
%128 = insertelement <2 x double> poison, double %80, i64 0
%129 = insertelement <2 x double> %128, double %84, i64 1
%130 = fdiv <2 x double> %129, %124
%131 = insertelement <2 x double> %87, double %92, i64 1
%132 = fdiv <2 x double> %131, %124
%133 = insertelement <2 x double> %89, double %93, i64 1
%134 = fdiv <2 x double> %133, %124
%135 = insertelement <2 x double> poison, double %90, i64 0
%136 = insertelement <2 x double> %135, double %94, i64 1
%137 = fdiv <2 x double> %136, %124
%138 = insertelement <2 x double> poison, double %110, i64 0
%139 = shufflevector <2 x double> %138, <2 x double> poison, <2 x i32> zeroinitializer
%140 = fmul <2 x double> %127, %139
%141 = insertelement <2 x double> poison, double %102, i64 0
%142 = shufflevector <2 x double> %141, <2 x double> poison, <2 x i32> zeroinitializer
%143 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %142, <2 x double> %125, <2 x double> %140)
%144 = insertelement <2 x double> poison, double %118, i64 0
%145 = shufflevector <2 x double> %144, <2 x double> poison, <2 x i32> zeroinitializer
%146 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %145, <2 x double> %130, <2 x double> %143)
%147 = fadd <2 x double> %146, <double 2.500000e-01, double 2.500000e-01>
%148 = fmul <2 x double> %134, %139
%149 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %142, <2 x double> %132, <2 x double> %148)
%150 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %145, <2 x double> %137, <2 x double> %149)
%151 = fadd <2 x double> %150, <double 2.500000e-01, double 2.500000e-01>
%152 = insertelement <2 x double> poison, double %5, i64 0
%153 = shufflevector <2 x double> %152, <2 x double> poison, <2 x i32> zeroinitializer
%154 = fmul <2 x double> %127, %153
%155 = insertelement <2 x double> poison, double %4, i64 0
%156 = shufflevector <2 x double> %155, <2 x double> poison, <2 x i32> zeroinitializer
%157 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %156, <2 x double> %125, <2 x double> %154)
%158 = insertelement <2 x double> poison, double %6, i64 0
%159 = shufflevector <2 x double> %158, <2 x double> poison, <2 x i32> zeroinitializer
%160 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %159, <2 x double> %130, <2 x double> %157)
%161 = fadd <2 x double> %160, %147
%162 = bitcast double* %7 to <2 x double>*
store <2 x double> %161, <2 x double>* %162
%163 = getelementptr inbounds double, double* %7, i64 2
%164 = fmul <2 x double> %134, %153
%165 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %156, <2 x double> %132, <2 x double> %164)
%166 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %159, <2 x double> %137, <2 x double> %165)
%167 = fadd <2 x double> %166, %151
%168 = bitcast double* %163 to <2 x double>*
store <2 x double> %167, <2 x double>* %168
ret void
}