#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 */
int /*<<< orphan*/ exit(int);
int /*<<< orphan*/ inline_packed_sse2_add(double *, double *, double *);
int /*<<< orphan*/ inline_packed_sse2_mul(double *, double *, double *);
int /*<<< orphan*/ inline_packed_sse_add(float *, float *, float *);
int /*<<< orphan*/ inline_packed_sse_mul(float *, float *, float *);
int /*<<< orphan*/ inline_unpacked_sse2_add(double *, double *, double *);
int /*<<< orphan*/ inline_unpacked_sse2_mul(double *, double *, double *);
int /*<<< orphan*/ inline_unpacked_sse_add(float *, float *, float *);
int /*<<< orphan*/ inline_unpacked_sse_mul(float *, float *, float *);
int /*<<< orphan*/ printf(char *, ...);
scalar_t__ strcasecmp(char *, char *);
int main(int argc, char **argv) {
  int i, packed = 0, sse = 0;
  float a[4] = {1.0, 2.0, 3.0, 4.0};
  float b[4] = {2.0, 3.0, 4.0, 5.0};
  float c[4] = {0.0, 0.0, 0.0, 0.0};
  double d[4] = {1.0, 2.0, 3.0, 4.0};
  double e[4] = {2.0, 3.0, 4.0, 5.0};
  double f[4] = {0.0, 0.0, 0.0, 0.0};
  if (argc != 3) {
  bail:
    printf("Usage %s: <packed|unpacked> <sse|sse2>\n", argv[0]);
    exit(1);
  }
  if (strcasecmp(argv[1], "packed") == 0)
    packed = 1;
  else if (strcasecmp(argv[1], "unpacked") == 0)
    packed = 0;
  else
    goto bail;
  if (strcasecmp(argv[2], "sse") == 0)
    sse = 1;
  else if (strcasecmp(argv[2], "sse2") == 0)
    sse = 0;
  else
    goto bail;
  printf("Vector 1: %f %f %f %f\n", a[0], a[1], a[2], a[3]);
  printf("Vector 2: %f %f %f %f\n\n", b[0], b[1], b[2], b[3]);
  if ((packed == 0) && (sse == 1)) {
    for (i = 0; i < 100; i++) {
      inline_unpacked_sse_add(&a[0], &b[0], &c[0]);
    }
    printf("%d SSE Unpacked Adds: Result %f\n", 100, c[0]);
    for (i = 0; i < 100; i++) {
      inline_unpacked_sse_mul(&a[0], &b[0], &c[0]);
    }
    printf("%d SSE Unpacked Muls: Result %f\n", 100, c[0]);
  }
  if ((packed == 1) && (sse == 1)) {
    for (i = 0; i < 100; i++) {
      inline_packed_sse_add(a, b, c);
    }
    printf("%d SSE Packed Adds: Result %f %f %f %f\n", 100, c[0], c[1], c[2],
           c[3]);
    for (i = 0; i < 100; i++) {
      inline_packed_sse_mul(a, b, c);
    }
    printf("%d SSE Packed Muls: Result %f %f %f %f\n", 100, c[0], c[1], c[2],
           c[3]);
  }
  if ((packed == 0) && (sse == 0)) {
    for (i = 0; i < 100; i++) {
      inline_unpacked_sse2_add(&d[0], &e[0], &f[0]);
    }
    printf("%d SSE2 Unpacked Adds: Result %f\n", 100, c[0]);
    for (i = 0; i < 100; i++) {
      inline_unpacked_sse2_mul(&d[0], &e[0], &f[0]);
    }
    printf("%d SSE2 Unpacked Muls: Result %f\n", 100, c[0]);
  }
  if ((packed == 1) && (sse == 0)) {
    for (i = 0; i < 100; i++) {
      inline_packed_sse2_add(&d[0], &e[0], &f[0]);
    }
    printf("%d SSE2 Packed Adds: Result %f\n", 100, c[0]);
    for (i = 0; i < 100; i++) {
      inline_packed_sse2_mul(&d[0], &e[0], &f[0]);
    }
    printf("%d SSE2 Packed Muls: Result %f\n", 100, c[0]);
  }
  exit(0);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    0xe12(%rip),%rax
mov    %rax,-0x30(%rbp)
mov    0xe0f(%rip),%rax
mov    %rax,-0x28(%rbp)
mov    0xe0c(%rip),%rax
mov    %rax,-0x40(%rbp)
mov    0xe09(%rip),%rax
mov    %rax,-0x38(%rbp)
lea    -0x50(%rbp),%rdi
xor    %esi,%esi
mov    $0x10,%edx
call   1070 <memset@plt>
mov    0xdf6(%rip),%rax
mov    %rax,-0x70(%rbp)
mov    0xdf3(%rip),%rax
mov    %rax,-0x68(%rbp)
mov    0xdf0(%rip),%rax
mov    %rax,-0x60(%rbp)
mov    0xded(%rip),%rax
mov    %rax,-0x58(%rbp)
mov    0xdea(%rip),%rax
mov    %rax,-0x90(%rbp)
mov    0xde4(%rip),%rax
mov    %rax,-0x88(%rbp)
mov    0xdde(%rip),%rax
mov    %rax,-0x80(%rbp)
mov    0xddb(%rip),%rax
mov    %rax,-0x78(%rbp)
lea    -0xb0(%rbp),%rdi
xor    %esi,%esi
mov    $0x20,%edx
call   1070 <memset@plt>
cmpl   $0x3,-0x8(%rbp)
je     12c2 <main+0x102>
jmp    12a3 <main+0xe3>
mov    -0x10(%rbp),%rax
mov    (%rax),%rsi
lea    0xdaf(%rip),%rdi
mov    $0x0,%al
call   1060 <printf@plt>
mov    $0x1,%edi
call   10d0 <exit@plt>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xdb9(%rip),%rsi
call   1030 <strcasecmp@plt>
cmp    $0x0,%rax
jne    12ec <main+0x12c>
movl   $0x1,-0x18(%rbp)
jmp    1320 <main+0x160>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rdi
lea    0xd8d(%rip),%rsi
call   1030 <strcasecmp@plt>
cmp    $0x0,%rax
jne    1316 <main+0x156>
movl   $0x0,-0x18(%rbp)
jmp    131b <main+0x15b>
jmp    12a3 <main+0xe3>
jmp    1320 <main+0x160>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
lea    0xd62(%rip),%rsi
call   1030 <strcasecmp@plt>
cmp    $0x0,%rax
jne    134a <main+0x18a>
movl   $0x1,-0x1c(%rbp)
jmp    137e <main+0x1be>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdi
lea    0xd3c(%rip),%rsi
call   1030 <strcasecmp@plt>
cmp    $0x0,%rax
jne    1374 <main+0x1b4>
movl   $0x0,-0x1c(%rbp)
jmp    1379 <main+0x1b9>
jmp    12a3 <main+0xe3>
jmp    137e <main+0x1be>
movss  -0x30(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x2c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x28(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x24(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xcf1(%rip),%rdi
mov    $0x4,%al
call   1060 <printf@plt>
movss  -0x40(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x38(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x34(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xcd6(%rip),%rdi
mov    $0x4,%al
call   1060 <printf@plt>
cmpl   $0x0,-0x18(%rbp)
jne    148e <main+0x2ce>
cmpl   $0x1,-0x1c(%rbp)
jne    148e <main+0x2ce>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    1426 <main+0x266>
lea    -0x30(%rbp),%rdi
lea    -0x40(%rbp),%rsi
lea    -0x50(%rbp),%rdx
call   10c0 <inline_unpacked_sse_add@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    13fd <main+0x23d>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xc93(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    1472 <main+0x2b2>
lea    -0x30(%rbp),%rdi
lea    -0x40(%rbp),%rsi
lea    -0x50(%rbp),%rdx
call   10e0 <inline_unpacked_sse_mul@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1449 <main+0x289>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xc68(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
cmpl   $0x1,-0x18(%rbp)
jne    1570 <main+0x3b0>
cmpl   $0x1,-0x1c(%rbp)
jne    1570 <main+0x3b0>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    14d2 <main+0x312>
lea    -0x30(%rbp),%rdi
lea    -0x40(%rbp),%rsi
lea    -0x50(%rbp),%rdx
call   10b0 <inline_packed_sse_add@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    14a9 <main+0x2e9>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x48(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x44(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xc0e(%rip),%rdi
mov    $0x64,%esi
mov    $0x4,%al
call   1060 <printf@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    1539 <main+0x379>
lea    -0x30(%rbp),%rdi
lea    -0x40(%rbp),%rsi
lea    -0x50(%rbp),%rdx
call   1080 <inline_packed_sse_mul@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1510 <main+0x350>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x4c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movss  -0x48(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x44(%rbp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xbcf(%rip),%rdi
mov    $0x64,%esi
mov    $0x4,%al
call   1060 <printf@plt>
cmpl   $0x0,-0x18(%rbp)
jne    1628 <main+0x468>
cmpl   $0x0,-0x1c(%rbp)
jne    1628 <main+0x468>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    15ba <main+0x3fa>
lea    -0x70(%rbp),%rdi
lea    -0x90(%rbp),%rsi
lea    -0xb0(%rbp),%rdx
call   10a0 <inline_unpacked_sse2_add@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    158b <main+0x3cb>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xb91(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    160c <main+0x44c>
lea    -0x70(%rbp),%rdi
lea    -0x90(%rbp),%rsi
lea    -0xb0(%rbp),%rdx
call   1090 <inline_unpacked_sse2_mul@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    15dd <main+0x41d>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xb61(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
cmpl   $0x1,-0x18(%rbp)
jne    16e0 <main+0x520>
cmpl   $0x0,-0x1c(%rbp)
jne    16e0 <main+0x520>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    1672 <main+0x4b2>
lea    -0x70(%rbp),%rdi
lea    -0x90(%rbp),%rsi
lea    -0xb0(%rbp),%rdx
call   1040 <inline_packed_sse2_add@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1643 <main+0x483>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xb1d(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
movl   $0x0,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jge    16c4 <main+0x504>
lea    -0x70(%rbp),%rdi
lea    -0x90(%rbp),%rsi
lea    -0xb0(%rbp),%rdx
call   1050 <inline_packed_sse2_mul@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1695 <main+0x4d5>
movss  -0x50(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xaeb(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
xor    %edi,%edi
call   10d0 <exit@plt>

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xb8,%rsp
mov    %rsi,%r12
movaps 0xe65(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
movaps 0xe69(%rip),%xmm0
movaps %xmm0,0x20(%rsp)
xorps  %xmm0,%xmm0
movaps %xmm0,0x10(%rsp)
movaps 0xe75(%rip),%xmm1
movaps %xmm1,0xa0(%rsp)
movaps 0xe56(%rip),%xmm1
movaps %xmm1,0x90(%rsp)
movaps 0xe77(%rip),%xmm1
movaps %xmm1,0x80(%rsp)
movaps 0xe58(%rip),%xmm1
movaps %xmm1,0x70(%rsp)
movaps %xmm0,0x60(%rsp)
movaps %xmm0,0x50(%rsp)
cmp    $0x3,%edi
jne    1607 <main+0x457>
mov    0x8(%r12),%rbx
lea    0xe7e(%rip),%rsi
mov    %rbx,%rdi
call   1030 <strcasecmp@plt>
mov    %rax,%r13
test   %rax,%rax
je     1264 <main+0xb4>
lea    0xe65(%rip),%rsi
mov    %rbx,%rdi
call   1030 <strcasecmp@plt>
test   %rax,%rax
jne    1607 <main+0x457>
test   %r13,%r13
setne  %r14b
mov    0x10(%r12),%rbx
lea    0xe4a(%rip),%rsi
mov    %rbx,%rdi
call   1030 <strcasecmp@plt>
mov    %rax,%r15
test   %rax,%rax
je     129f <main+0xef>
lea    0xe37(%rip),%rsi
mov    %rbx,%rdi
call   1030 <strcasecmp@plt>
test   %rax,%rax
jne    1607 <main+0x457>
test   %r15,%r15
setne  0xf(%rsp)
sete   %bl
lea    0xe19(%rip),%rdi
movsd  0xd47(%rip),%xmm0
movsd  0xd47(%rip),%xmm1
movsd  0xd47(%rip),%xmm2
movsd  0xd47(%rip),%xmm3
mov    $0x4,%al
call   1060 <printf@plt>
lea    0xe02(%rip),%rdi
movsd  0xd39(%rip),%xmm3
movsd  0xd19(%rip),%xmm0
movsd  0xd19(%rip),%xmm1
movsd  0xd19(%rip),%xmm2
mov    $0x4,%al
call   1060 <printf@plt>
and    %r14b,%bl
cmp    $0x1,%bl
jne    13b5 <main+0x205>
mov    %r13,0x48(%rsp)
mov    $0x64,%ebp
lea    0x30(%rsp),%r12
lea    0x20(%rsp),%r13
lea    0x10(%rsp),%rbx
nopl   0x0(%rax,%rax,1)
mov    %r12,%rdi
mov    %r13,%rsi
mov    %rbx,%rdx
call   10b0 <inline_unpacked_sse_add@plt>
add    $0xffffffff,%ebp
jne    1330 <main+0x180>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xda5(%rip),%rdi
mov    $0x64,%ebp
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
lea    0x30(%rsp),%r12
lea    0x20(%rsp),%r13
lea    0x10(%rsp),%rbx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r12,%rdi
mov    %r13,%rsi
mov    %rbx,%rdx
call   10d0 <inline_unpacked_sse_mul@plt>
add    $0xffffffff,%ebp
jne    1380 <main+0x1d0>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xd76(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
mov    0x48(%rsp),%r13
or     %r13,%r15
jne    149e <main+0x2ee>
mov    $0x64,%ebp
lea    0x30(%rsp),%r15
lea    0x20(%rsp),%r12
lea    0x10(%rsp),%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r15,%rdi
mov    %r12,%rsi
mov    %rbx,%rdx
call   10a0 <inline_packed_sse_add@plt>
add    $0xffffffff,%ebp
jne    13e0 <main+0x230>
movss  0x10(%rsp),%xmm0
movss  0x14(%rsp),%xmm1
cvtss2sd %xmm0,%xmm0
cvtss2sd %xmm1,%xmm1
movss  0x18(%rsp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  0x1c(%rsp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xd19(%rip),%rdi
mov    $0x64,%ebp
mov    $0x64,%esi
mov    $0x4,%al
call   1060 <printf@plt>
lea    0x30(%rsp),%r15
lea    0x20(%rsp),%r12
lea    0x10(%rsp),%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r15,%rdi
mov    %r12,%rsi
mov    %rbx,%rdx
call   1070 <inline_packed_sse_mul@plt>
add    $0xffffffff,%ebp
jne    1450 <main+0x2a0>
movss  0x10(%rsp),%xmm0
movss  0x14(%rsp),%xmm1
cvtss2sd %xmm0,%xmm0
cvtss2sd %xmm1,%xmm1
movss  0x18(%rsp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  0x1c(%rsp),%xmm3
cvtss2sd %xmm3,%xmm3
lea    0xcd1(%rip),%rdi
mov    $0x64,%esi
mov    $0x4,%al
call   1060 <printf@plt>
and    0xf(%rsp),%r14b
cmp    $0x1,%r14b
jne    1550 <main+0x3a0>
mov    $0x64,%ebp
lea    0x90(%rsp),%r15
lea    0x70(%rsp),%r12
lea    0x50(%rsp),%rbx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r15,%rdi
mov    %r12,%rsi
mov    %rbx,%rdx
call   1090 <inline_unpacked_sse2_add@plt>
add    $0xffffffff,%ebp
jne    14d0 <main+0x320>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xc97(%rip),%rdi
mov    $0x64,%ebp
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
lea    0x90(%rsp),%r15
lea    0x70(%rsp),%r12
lea    0x50(%rsp),%rbx
nopw   0x0(%rax,%rax,1)
mov    %r15,%rdi
mov    %r12,%rsi
mov    %rbx,%rdx
call   1080 <inline_unpacked_sse2_mul@plt>
add    $0xffffffff,%ebp
jne    1520 <main+0x370>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xc69(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
test   %r13,%r13
sete   %al
and    0xf(%rsp),%al
cmp    $0x1,%al
jne    1600 <main+0x450>
mov    $0x64,%ebp
lea    0x90(%rsp),%r14
lea    0x70(%rsp),%r15
lea    0x50(%rsp),%rbx
nopl   0x0(%rax)
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
call   1040 <inline_packed_sse2_add@plt>
add    $0xffffffff,%ebp
jne    1580 <main+0x3d0>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xc2b(%rip),%rdi
mov    $0x64,%ebp
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
lea    0x90(%rsp),%r14
lea    0x70(%rsp),%r15
lea    0x50(%rsp),%rbx
nopw   0x0(%rax,%rax,1)
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
call   1050 <inline_packed_sse2_mul@plt>
add    $0xffffffff,%ebp
jne    15d0 <main+0x420>
movss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
lea    0xbfb(%rip),%rdi
mov    $0x64,%esi
mov    $0x1,%al
call   1060 <printf@plt>
xor    %edi,%edi
call   10c0 <exit@plt>
mov    (%r12),%rsi
lea    0xa7e(%rip),%rdi
xor    %eax,%eax
call   1060 <printf@plt>
mov    $0x1,%edi
call   10c0 <exit@plt>

LLVM IR (-O0):
@__const.main.a = [4 x float] [float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00]
@__const.main.b = [4 x float] [float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00]
@__const.main.d = [4 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00]
@__const.main.e = [4 x double] [double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00]
@.str = [40 x i8] c"Usage %s: <packed|unpacked> <sse|sse2>\0A\00"
@.str.1 = [7 x i8] c"packed\00"
@.str.2 = [9 x i8] c"unpacked\00"
@.str.3 = [4 x i8] c"sse\00"
@.str.4 = [5 x i8] c"sse2\00"
@.str.5 = [23 x i8] c"Vector 1: %f %f %f %f\0A\00"
@.str.6 = [24 x i8] c"Vector 2: %f %f %f %f\0A\0A\00"
@.str.7 = [33 x i8] c"%d SSE Unpacked Adds: Result %f\0A\00"
@.str.8 = [33 x i8] c"%d SSE Unpacked Muls: Result %f\0A\00"
@.str.9 = [40 x i8] c"%d SSE Packed Adds: Result %f %f %f %f\0A\00"
@.str.10 = [40 x i8] c"%d SSE Packed Muls: Result %f %f %f %f\0A\00"
@.str.11 = [34 x i8] c"%d SSE2 Unpacked Adds: Result %f\0A\00"
@.str.12 = [34 x i8] c"%d SSE2 Unpacked Muls: Result %f\0A\00"
@.str.13 = [32 x i8] c"%d SSE2 Packed Adds: Result %f\0A\00"
@.str.14 = [32 x i8] c"%d SSE2 Packed Muls: Result %f\0A\00"
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca [4 x float]
%10 = alloca [4 x float]
%11 = alloca [4 x float]
%12 = alloca [4 x double]
%13 = alloca [4 x double]
%14 = alloca [4 x double]
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
store i32 0, i32* %7
store i32 0, i32* %8
%15 = bitcast [4 x float]* %9 to i8*
%16 = bitcast [4 x float]* %10 to i8*
%17 = bitcast [4 x float]* %11 to i8*
%18 = bitcast [4 x double]* %12 to i8*
%19 = bitcast [4 x double]* %13 to i8*
%20 = bitcast [4 x double]* %14 to i8*
%21 = load i32, i32* %4
%22 = icmp ne i32 %21, 3
br i1 %22, label %23, label %30
23: ; preds = %2
br label %24
24: ; preds = %60, %44, %23
%25 = load i8**, i8*** %5
%26 = getelementptr inbounds i8*, i8** %25, i64 0
%27 = load i8*, i8** %26
%28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str, i64 0, i64 0), i8* %27)
%29 = call i32 @exit(i32 1)
unreachable
30: ; preds = %2
%31 = load i8**, i8*** %5
%32 = getelementptr inbounds i8*, i8** %31, i64 1
%33 = load i8*, i8** %32
%34 = call i64 @strcasecmp(i8* %33, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0))
%35 = icmp eq i64 %34, 0
br i1 %35, label %36, label %37
36: ; preds = %30
store i32 1, i32* %7
br label %46
37: ; preds = %30
%38 = load i8**, i8*** %5
%39 = getelementptr inbounds i8*, i8** %38, i64 1
%40 = load i8*, i8** %39
%41 = call i64 @strcasecmp(i8* %40, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0))
%42 = icmp eq i64 %41, 0
br i1 %42, label %43, label %44
43: ; preds = %37
store i32 0, i32* %7
br label %45
44: ; preds = %37
br label %24
45: ; preds = %43
br label %46
46: ; preds = %45, %36
%47 = load i8**, i8*** %5
%48 = getelementptr inbounds i8*, i8** %47, i64 2
%49 = load i8*, i8** %48
%50 = call i64 @strcasecmp(i8* %49, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0))
%51 = icmp eq i64 %50, 0
br i1 %51, label %52, label %53
52: ; preds = %46
store i32 1, i32* %8
br label %62
53: ; preds = %46
%54 = load i8**, i8*** %5
%55 = getelementptr inbounds i8*, i8** %54, i64 2
%56 = load i8*, i8** %55
%57 = call i64 @strcasecmp(i8* %56, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0))
%58 = icmp eq i64 %57, 0
br i1 %58, label %59, label %60
59: ; preds = %53
store i32 0, i32* %8
br label %61
60: ; preds = %53
br label %24
61: ; preds = %59
br label %62
62: ; preds = %61, %52
%63 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 0
%64 = load float, float* %63
%65 = fpext float %64 to double
%66 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 1
%67 = load float, float* %66
%68 = fpext float %67 to double
%69 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 2
%70 = load float, float* %69
%71 = fpext float %70 to double
%72 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 3
%73 = load float, float* %72
%74 = fpext float %73 to double
%75 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.5, i64 0, i64 0), double %65, double %68, double %71, double %74)
%76 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 0
%77 = load float, float* %76
%78 = fpext float %77 to double
%79 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 1
%80 = load float, float* %79
%81 = fpext float %80 to double
%82 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 2
%83 = load float, float* %82
%84 = fpext float %83 to double
%85 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 3
%86 = load float, float* %85
%87 = fpext float %86 to double
%88 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.6, i64 0, i64 0), double %78, double %81, double %84, double %87)
%89 = load i32, i32* %7
%90 = icmp eq i32 %89, 0
br i1 %90, label %91, label %127
91: ; preds = %62
%92 = load i32, i32* %8
%93 = icmp eq i32 %92, 1
br i1 %93, label %94, label %127
94: ; preds = %91
store i32 0, i32* %6
br label %95
95: ; preds = %103, %94
%96 = load i32, i32* %6
%97 = icmp slt i32 %96, 100
br i1 %97, label %98, label %106
98: ; preds = %95
%99 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 0
%100 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 0
%101 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%102 = call i32 @inline_unpacked_sse_add(float* %99, float* %100, float* %101)
br label %103
103: ; preds = %98
%104 = load i32, i32* %6
%105 = add nsw i32 %104, 1
store i32 %105, i32* %6
br label %95
106: ; preds = %95
%107 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%108 = load float, float* %107
%109 = fpext float %108 to double
%110 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.7, i64 0, i64 0), i32 100, double %109)
store i32 0, i32* %6
br label %111
111: ; preds = %119, %106
%112 = load i32, i32* %6
%113 = icmp slt i32 %112, 100
br i1 %113, label %114, label %122
114: ; preds = %111
%115 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 0
%116 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 0
%117 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%118 = call i32 @inline_unpacked_sse_mul(float* %115, float* %116, float* %117)
br label %119
119: ; preds = %114
%120 = load i32, i32* %6
%121 = add nsw i32 %120, 1
store i32 %121, i32* %6
br label %111
122: ; preds = %111
%123 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%124 = load float, float* %123
%125 = fpext float %124 to double
%126 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.8, i64 0, i64 0), i32 100, double %125)
br label %127
127: ; preds = %122, %91, %62
%128 = load i32, i32* %7
%129 = icmp eq i32 %128, 1
br i1 %129, label %130, label %184
130: ; preds = %127
%131 = load i32, i32* %8
%132 = icmp eq i32 %131, 1
br i1 %132, label %133, label %184
133: ; preds = %130
store i32 0, i32* %6
br label %134
134: ; preds = %142, %133
%135 = load i32, i32* %6
%136 = icmp slt i32 %135, 100
br i1 %136, label %137, label %145
137: ; preds = %134
%138 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 0
%139 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 0
%140 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%141 = call i32 @inline_packed_sse_add(float* %138, float* %139, float* %140)
br label %142
142: ; preds = %137
%143 = load i32, i32* %6
%144 = add nsw i32 %143, 1
store i32 %144, i32* %6
br label %134
145: ; preds = %134
%146 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%147 = load float, float* %146
%148 = fpext float %147 to double
%149 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 1
%150 = load float, float* %149
%151 = fpext float %150 to double
%152 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 2
%153 = load float, float* %152
%154 = fpext float %153 to double
%155 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 3
%156 = load float, float* %155
%157 = fpext float %156 to double
%158 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.9, i64 0, i64 0), i32 100, double %148, double %151, double %154, double %157)
store i32 0, i32* %6
br label %159
159: ; preds = %167, %145
%160 = load i32, i32* %6
%161 = icmp slt i32 %160, 100
br i1 %161, label %162, label %170
162: ; preds = %159
%163 = getelementptr inbounds [4 x float], [4 x float]* %9, i64 0, i64 0
%164 = getelementptr inbounds [4 x float], [4 x float]* %10, i64 0, i64 0
%165 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%166 = call i32 @inline_packed_sse_mul(float* %163, float* %164, float* %165)
br label %167
167: ; preds = %162
%168 = load i32, i32* %6
%169 = add nsw i32 %168, 1
store i32 %169, i32* %6
br label %159
170: ; preds = %159
%171 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%172 = load float, float* %171
%173 = fpext float %172 to double
%174 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 1
%175 = load float, float* %174
%176 = fpext float %175 to double
%177 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 2
%178 = load float, float* %177
%179 = fpext float %178 to double
%180 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 3
%181 = load float, float* %180
%182 = fpext float %181 to double
%183 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.10, i64 0, i64 0), i32 100, double %173, double %176, double %179, double %182)
br label %184
184: ; preds = %170, %130, %127
%185 = load i32, i32* %7
%186 = icmp eq i32 %185, 0
br i1 %186, label %187, label %223
187: ; preds = %184
%188 = load i32, i32* %8
%189 = icmp eq i32 %188, 0
br i1 %189, label %190, label %223
190: ; preds = %187
store i32 0, i32* %6
br label %191
191: ; preds = %199, %190
%192 = load i32, i32* %6
%193 = icmp slt i32 %192, 100
br i1 %193, label %194, label %202
194: ; preds = %191
%195 = getelementptr inbounds [4 x double], [4 x double]* %12, i64 0, i64 0
%196 = getelementptr inbounds [4 x double], [4 x double]* %13, i64 0, i64 0
%197 = getelementptr inbounds [4 x double], [4 x double]* %14, i64 0, i64 0
%198 = call i32 @inline_unpacked_sse2_add(double* %195, double* %196, double* %197)
br label %199
199: ; preds = %194
%200 = load i32, i32* %6
%201 = add nsw i32 %200, 1
store i32 %201, i32* %6
br label %191
202: ; preds = %191
%203 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%204 = load float, float* %203
%205 = fpext float %204 to double
%206 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.11, i64 0, i64 0), i32 100, double %205)
store i32 0, i32* %6
br label %207
207: ; preds = %215, %202
%208 = load i32, i32* %6
%209 = icmp slt i32 %208, 100
br i1 %209, label %210, label %218
210: ; preds = %207
%211 = getelementptr inbounds [4 x double], [4 x double]* %12, i64 0, i64 0
%212 = getelementptr inbounds [4 x double], [4 x double]* %13, i64 0, i64 0
%213 = getelementptr inbounds [4 x double], [4 x double]* %14, i64 0, i64 0
%214 = call i32 @inline_unpacked_sse2_mul(double* %211, double* %212, double* %213)
br label %215
215: ; preds = %210
%216 = load i32, i32* %6
%217 = add nsw i32 %216, 1
store i32 %217, i32* %6
br label %207
218: ; preds = %207
%219 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%220 = load float, float* %219
%221 = fpext float %220 to double
%222 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.12, i64 0, i64 0), i32 100, double %221)
br label %223
223: ; preds = %218, %187, %184
%224 = load i32, i32* %7
%225 = icmp eq i32 %224, 1
br i1 %225, label %226, label %262
226: ; preds = %223
%227 = load i32, i32* %8
%228 = icmp eq i32 %227, 0
br i1 %228, label %229, label %262
229: ; preds = %226
store i32 0, i32* %6
br label %230
230: ; preds = %238, %229
%231 = load i32, i32* %6
%232 = icmp slt i32 %231, 100
br i1 %232, label %233, label %241
233: ; preds = %230
%234 = getelementptr inbounds [4 x double], [4 x double]* %12, i64 0, i64 0
%235 = getelementptr inbounds [4 x double], [4 x double]* %13, i64 0, i64 0
%236 = getelementptr inbounds [4 x double], [4 x double]* %14, i64 0, i64 0
%237 = call i32 @inline_packed_sse2_add(double* %234, double* %235, double* %236)
br label %238
238: ; preds = %233
%239 = load i32, i32* %6
%240 = add nsw i32 %239, 1
store i32 %240, i32* %6
br label %230
241: ; preds = %230
%242 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%243 = load float, float* %242
%244 = fpext float %243 to double
%245 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.13, i64 0, i64 0), i32 100, double %244)
store i32 0, i32* %6
br label %246
246: ; preds = %254, %241
%247 = load i32, i32* %6
%248 = icmp slt i32 %247, 100
br i1 %248, label %249, label %257
249: ; preds = %246
%250 = getelementptr inbounds [4 x double], [4 x double]* %12, i64 0, i64 0
%251 = getelementptr inbounds [4 x double], [4 x double]* %13, i64 0, i64 0
%252 = getelementptr inbounds [4 x double], [4 x double]* %14, i64 0, i64 0
%253 = call i32 @inline_packed_sse2_mul(double* %250, double* %251, double* %252)
br label %254
254: ; preds = %249
%255 = load i32, i32* %6
%256 = add nsw i32 %255, 1
store i32 %256, i32* %6
br label %246
257: ; preds = %246
%258 = getelementptr inbounds [4 x float], [4 x float]* %11, i64 0, i64 0
%259 = load float, float* %258
%260 = fpext float %259 to double
%261 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.14, i64 0, i64 0), i32 100, double %260)
br label %262
262: ; preds = %257, %226, %223
%263 = call i32 @exit(i32 0)
unreachable
}

LLVM IR (-O2):
@__const.main.a = [4 x float] [float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00]
@__const.main.b = [4 x float] [float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00]
@__const.main.d = [4 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00]
@__const.main.e = [4 x double] [double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00]
@.str = [40 x i8] c"Usage %s: <packed|unpacked> <sse|sse2>\0A\00"
@.str.1 = [7 x i8] c"packed\00"
@.str.2 = [9 x i8] c"unpacked\00"
@.str.3 = [4 x i8] c"sse\00"
@.str.4 = [5 x i8] c"sse2\00"
@.str.5 = [23 x i8] c"Vector 1: %f %f %f %f\0A\00"
@.str.6 = [24 x i8] c"Vector 2: %f %f %f %f\0A\0A\00"
@.str.7 = [33 x i8] c"%d SSE Unpacked Adds: Result %f\0A\00"
@.str.8 = [33 x i8] c"%d SSE Unpacked Muls: Result %f\0A\00"
@.str.9 = [40 x i8] c"%d SSE Packed Adds: Result %f %f %f %f\0A\00"
@.str.10 = [40 x i8] c"%d SSE Packed Muls: Result %f %f %f %f\0A\00"
@.str.11 = [34 x i8] c"%d SSE2 Unpacked Adds: Result %f\0A\00"
@.str.12 = [34 x i8] c"%d SSE2 Unpacked Muls: Result %f\0A\00"
@.str.13 = [32 x i8] c"%d SSE2 Packed Adds: Result %f\0A\00"
@.str.14 = [32 x i8] c"%d SSE2 Packed Muls: Result %f\0A\00"
define i32 @main(i32 %0, i8** nocapture %1) {
%3 = alloca [4 x float]
%4 = alloca [4 x float]
%5 = alloca [4 x float]
%6 = alloca [4 x double]
%7 = alloca [4 x double]
%8 = alloca [4 x double]
%9 = bitcast [4 x float]* %3 to i8*
%10 = bitcast [4 x float]* %4 to i8*
%11 = bitcast [4 x float]* %5 to i8*
%12 = bitcast [4 x double]* %6 to i8*
%13 = bitcast [4 x double]* %7 to i8*
%14 = bitcast [4 x double]* %8 to i8*
%15 = icmp eq i32 %0, 3
br i1 %15, label %20, label %16
16: ; preds = %34, %25, %2
%17 = load i8*, i8** %1
%18 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([40 x i8], [40 x i8]* @.str, i64 0, i64 0), i8* %17)
%19 = tail call i32 @exit(i32 1)
unreachable
20: ; preds = %2
%21 = getelementptr inbounds i8*, i8** %1, i64 1
%22 = load i8*, i8** %21
%23 = tail call i64 @strcasecmp(i8* %22, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0))
%24 = icmp eq i64 %23, 0
br i1 %24, label %28, label %25
25: ; preds = %20
%26 = tail call i64 @strcasecmp(i8* %22, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0))
%27 = icmp eq i64 %26, 0
br i1 %27, label %28, label %16
28: ; preds = %25, %20
%29 = xor i1 %24, true
%30 = getelementptr inbounds i8*, i8** %1, i64 2
%31 = load i8*, i8** %30
%32 = tail call i64 @strcasecmp(i8* %31, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i64 0, i64 0))
%33 = icmp eq i64 %32, 0
br i1 %33, label %37, label %34
34: ; preds = %28
%35 = tail call i64 @strcasecmp(i8* %31, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0))
%36 = icmp eq i64 %35, 0
br i1 %36, label %37, label %16
37: ; preds = %34, %28
%38 = xor i1 %33, true
%39 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 0
%40 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([23 x i8], [23 x i8]* @.str.5, i64 0, i64 0), double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00)
%41 = getelementptr inbounds [4 x float], [4 x float]* %4, i64 0, i64 0
%42 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([24 x i8], [24 x i8]* @.str.6, i64 0, i64 0), double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00)
%43 = select i1 %29, i1 %33, i1 false
br i1 %43, label %44, label %64
44: ; preds = %37
%45 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 0
br label %46
46: ; preds = %44, %46
%47 = phi i32 [ 0, %44 ], [ %49, %46 ]
%48 = call i32 @inline_unpacked_sse_add(float* %39, float* %41, float* %45)
%49 = add nuw nsw i32 %47, 1
%50 = icmp eq i32 %49, 100
br i1 %50, label %51, label %46
51: ; preds = %46
%52 = load float, float* %45
%53 = fpext float %52 to double
%54 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([33 x i8], [33 x i8]* @.str.7, i64 0, i64 0), i32 100, double %53)
br label %55
55: ; preds = %51, %55
%56 = phi i32 [ 0, %51 ], [ %58, %55 ]
%57 = call i32 @inline_unpacked_sse_mul(float* %39, float* %41, float* %45)
%58 = add nuw nsw i32 %56, 1
%59 = icmp eq i32 %58, 100
br i1 %59, label %60, label %55
60: ; preds = %55
%61 = load float, float* %45
%62 = fpext float %61 to double
%63 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([33 x i8], [33 x i8]* @.str.8, i64 0, i64 0), i32 100, double %62)
br label %64
64: ; preds = %60, %37
%65 = select i1 %24, i1 %33, i1 false
br i1 %65, label %66, label %101
66: ; preds = %64
%67 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 0
br label %68
68: ; preds = %66, %68
%69 = phi i32 [ 0, %66 ], [ %71, %68 ]
%70 = call i32 @inline_packed_sse_add(float* %39, float* %41, float* %67)
%71 = add nuw nsw i32 %69, 1
%72 = icmp eq i32 %71, 100
br i1 %72, label %73, label %68
73: ; preds = %68
%74 = load float, float* %67
%75 = fpext float %74 to double
%76 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 1
%77 = load float, float* %76
%78 = fpext float %77 to double
%79 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 2
%80 = load float, float* %79
%81 = fpext float %80 to double
%82 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 3
%83 = load float, float* %82
%84 = fpext float %83 to double
%85 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([40 x i8], [40 x i8]* @.str.9, i64 0, i64 0), i32 100, double %75, double %78, double %81, double %84)
br label %86
86: ; preds = %73, %86
%87 = phi i32 [ 0, %73 ], [ %89, %86 ]
%88 = call i32 @inline_packed_sse_mul(float* %39, float* %41, float* %67)
%89 = add nuw nsw i32 %87, 1
%90 = icmp eq i32 %89, 100
br i1 %90, label %91, label %86
91: ; preds = %86
%92 = load float, float* %67
%93 = fpext float %92 to double
%94 = load float, float* %76
%95 = fpext float %94 to double
%96 = load float, float* %79
%97 = fpext float %96 to double
%98 = load float, float* %82
%99 = fpext float %98 to double
%100 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([40 x i8], [40 x i8]* @.str.10, i64 0, i64 0), i32 100, double %93, double %95, double %97, double %99)
br label %101
101: ; preds = %91, %64
%102 = select i1 %29, i1 %38, i1 false
br i1 %102, label %103, label %126
103: ; preds = %101
%104 = getelementptr inbounds [4 x double], [4 x double]* %6, i64 0, i64 0
%105 = getelementptr inbounds [4 x double], [4 x double]* %7, i64 0, i64 0
%106 = getelementptr inbounds [4 x double], [4 x double]* %8, i64 0, i64 0
br label %107
107: ; preds = %103, %107
%108 = phi i32 [ 0, %103 ], [ %110, %107 ]
%109 = call i32 @inline_unpacked_sse2_add(double* %104, double* %105, double* %106)
%110 = add nuw nsw i32 %108, 1
%111 = icmp eq i32 %110, 100
br i1 %111, label %112, label %107
112: ; preds = %107
%113 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 0
%114 = load float, float* %113
%115 = fpext float %114 to double
%116 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([34 x i8], [34 x i8]* @.str.11, i64 0, i64 0), i32 100, double %115)
br label %117
117: ; preds = %112, %117
%118 = phi i32 [ 0, %112 ], [ %120, %117 ]
%119 = call i32 @inline_unpacked_sse2_mul(double* %104, double* %105, double* %106)
%120 = add nuw nsw i32 %118, 1
%121 = icmp eq i32 %120, 100
br i1 %121, label %122, label %117
122: ; preds = %117
%123 = load float, float* %113
%124 = fpext float %123 to double
%125 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([34 x i8], [34 x i8]* @.str.12, i64 0, i64 0), i32 100, double %124)
br label %126
126: ; preds = %122, %101
%127 = select i1 %24, i1 %38, i1 false
br i1 %127, label %128, label %151
128: ; preds = %126
%129 = getelementptr inbounds [4 x double], [4 x double]* %6, i64 0, i64 0
%130 = getelementptr inbounds [4 x double], [4 x double]* %7, i64 0, i64 0
%131 = getelementptr inbounds [4 x double], [4 x double]* %8, i64 0, i64 0
br label %132
132: ; preds = %128, %132
%133 = phi i32 [ 0, %128 ], [ %135, %132 ]
%134 = call i32 @inline_packed_sse2_add(double* %129, double* %130, double* %131)
%135 = add nuw nsw i32 %133, 1
%136 = icmp eq i32 %135, 100
br i1 %136, label %137, label %132
137: ; preds = %132
%138 = getelementptr inbounds [4 x float], [4 x float]* %5, i64 0, i64 0
%139 = load float, float* %138
%140 = fpext float %139 to double
%141 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([32 x i8], [32 x i8]* @.str.13, i64 0, i64 0), i32 100, double %140)
br label %142
142: ; preds = %137, %142
%143 = phi i32 [ 0, %137 ], [ %145, %142 ]
%144 = call i32 @inline_packed_sse2_mul(double* %129, double* %130, double* %131)
%145 = add nuw nsw i32 %143, 1
%146 = icmp eq i32 %145, 100
br i1 %146, label %147, label %142
147: ; preds = %142
%148 = load float, float* %138
%149 = fpext float %148 to double
%150 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([32 x i8], [32 x i8]* @.str.14, i64 0, i64 0), i32 100, double %149)
br label %151
151: ; preds = %147, %126
%152 = call i32 @exit(i32 0)
unreachable
}