#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 */
typedef scalar_t__ *sptr;

/* Variables and functions */
int /*<<< orphan*/ DoubleReferenceDct1D(double *, double *);
int /*<<< orphan*/ DoubleTransposeMatrix(double *, double *);
void ReferenceDct(int *matrix, int *newmatrix) {
  static char RoutineName[] = "ReferenceDct";
  int *mptr;
  double *sptr, *dptr;
  double sourcematrix[64], destmatrix[64];
  for (sptr = sourcematrix, mptr = matrix; mptr < matrix + 64; mptr++) {
    *(sptr++) = (double)*mptr;
  }
  for (dptr = destmatrix, sptr = sourcematrix; sptr < sourcematrix + 64;
       sptr += 8) {
    DoubleReferenceDct1D(sptr, dptr);
    dptr += 8;
  }
  DoubleTransposeMatrix(destmatrix, sourcematrix);
  for (dptr = destmatrix, sptr = sourcematrix; sptr < sourcematrix + 64;
       sptr += 8) {
    DoubleReferenceDct1D(sptr, dptr);
    dptr += 8;
  }
  DoubleTransposeMatrix(destmatrix, sourcematrix);
  for (sptr = sourcematrix, mptr = newmatrix; mptr < newmatrix + 64; sptr++) {
    *(mptr++) = (int)(*sptr > 0 ? (*(sptr) + 0.5) : (*(sptr)-0.5));
  }
}


x86 assembly (clang, -O0):
<ReferenceDct>:
push   %rbp
mov    %rsp,%rbp
sub    $0x440,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    -0x230(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x8(%rbp),%rcx
add    $0x100,%rcx
cmp    %rcx,%rax
jae    118a <ReferenceDct+0x6a>
mov    -0x18(%rbp),%rax
cvtsi2sdl (%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1146 <ReferenceDct+0x26>
lea    -0x430(%rbp),%rax
mov    %rax,-0x28(%rbp)
lea    -0x230(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
lea    -0x230(%rbp),%rcx
add    $0x200,%rcx
cmp    %rcx,%rax
jae    11e5 <ReferenceDct+0xc5>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1040 <DoubleReferenceDct1D@plt>
mov    -0x28(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x20(%rbp)
jmp    11a0 <ReferenceDct+0x80>
lea    -0x430(%rbp),%rdi
lea    -0x230(%rbp),%rsi
call   1030 <DoubleTransposeMatrix@plt>
lea    -0x430(%rbp),%rax
mov    %rax,-0x28(%rbp)
lea    -0x230(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
lea    -0x230(%rbp),%rcx
add    $0x200,%rcx
cmp    %rcx,%rax
jae    1253 <ReferenceDct+0x133>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1040 <DoubleReferenceDct1D@plt>
mov    -0x28(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x20(%rbp)
jmp    120e <ReferenceDct+0xee>
lea    -0x430(%rbp),%rdi
lea    -0x230(%rbp),%rsi
call   1030 <DoubleTransposeMatrix@plt>
lea    -0x230(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
add    $0x100,%rcx
cmp    %rcx,%rax
jae    130d <ReferenceDct+0x1ed>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    12c3 <ReferenceDct+0x1a3>
mov    -0x20(%rbp),%rax
movsd  0xd4e(%rip),%xmm0
addsd  (%rax),%xmm0
movsd  %xmm0,-0x438(%rbp)
ff
jmp    12df <ReferenceDct+0x1bf>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xd2d(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x438(%rbp)
ff
movsd  -0x438(%rbp),%xmm0
ff
cvttsd2si %xmm0,%ecx
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x18(%rbp)
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
jmp    1279 <ReferenceDct+0x159>
add    $0x440,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ReferenceDct>:
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x408,%rsp
mov    %rsi,%r14
cvtdq2pd (%rdi),%xmm0
movaps %xmm0,(%rsp)
cvtdq2pd 0x8(%rdi),%xmm0
movaps %xmm0,0x10(%rsp)
cvtdq2pd 0x10(%rdi),%xmm0
movaps %xmm0,0x20(%rsp)
cvtdq2pd 0x18(%rdi),%xmm0
movaps %xmm0,0x30(%rsp)
cvtdq2pd 0x20(%rdi),%xmm0
movaps %xmm0,0x40(%rsp)
cvtdq2pd 0x28(%rdi),%xmm0
movaps %xmm0,0x50(%rsp)
cvtdq2pd 0x30(%rdi),%xmm0
movaps %xmm0,0x60(%rsp)
cvtdq2pd 0x38(%rdi),%xmm0
movaps %xmm0,0x70(%rsp)
cvtdq2pd 0x40(%rdi),%xmm0
movaps %xmm0,0x80(%rsp)
cvtdq2pd 0x48(%rdi),%xmm0
movaps %xmm0,0x90(%rsp)
cvtdq2pd 0x50(%rdi),%xmm0
movaps %xmm0,0xa0(%rsp)
cvtdq2pd 0x58(%rdi),%xmm0
movaps %xmm0,0xb0(%rsp)
cvtdq2pd 0x60(%rdi),%xmm0
movaps %xmm0,0xc0(%rsp)
cvtdq2pd 0x68(%rdi),%xmm0
movaps %xmm0,0xd0(%rsp)
cvtdq2pd 0x70(%rdi),%xmm0
movaps %xmm0,0xe0(%rsp)
cvtdq2pd 0x78(%rdi),%xmm0
movaps %xmm0,0xf0(%rsp)
cvtdq2pd 0x80(%rdi),%xmm0
movaps %xmm0,0x100(%rsp)
cvtdq2pd 0x88(%rdi),%xmm0
movaps %xmm0,0x110(%rsp)
cvtdq2pd 0x90(%rdi),%xmm0
movaps %xmm0,0x120(%rsp)
cvtdq2pd 0x98(%rdi),%xmm0
movaps %xmm0,0x130(%rsp)
cvtdq2pd 0xa0(%rdi),%xmm0
movaps %xmm0,0x140(%rsp)
cvtdq2pd 0xa8(%rdi),%xmm0
movaps %xmm0,0x150(%rsp)
cvtdq2pd 0xb0(%rdi),%xmm0
movaps %xmm0,0x160(%rsp)
cvtdq2pd 0xb8(%rdi),%xmm0
movaps %xmm0,0x170(%rsp)
cvtdq2pd 0xc0(%rdi),%xmm0
movaps %xmm0,0x180(%rsp)
cvtdq2pd 0xc8(%rdi),%xmm0
movaps %xmm0,0x190(%rsp)
cvtdq2pd 0xd0(%rdi),%xmm0
movaps %xmm0,0x1a0(%rsp)
cvtdq2pd 0xd8(%rdi),%xmm0
movaps %xmm0,0x1b0(%rsp)
cvtdq2pd 0xe0(%rdi),%xmm0
movaps %xmm0,0x1c0(%rsp)
cvtdq2pd 0xe8(%rdi),%xmm0
movaps %xmm0,0x1d0(%rsp)
cvtdq2pd 0xf0(%rdi),%xmm0
movaps %xmm0,0x1e0(%rsp)
cvtdq2pd 0xf8(%rdi),%xmm0
mov    %rsp,%rbx
movaps %xmm0,0x1f0(%rsp)
lea    0x200(%rsp),%r15
lea    0x200(%rsp),%r12
nopw   0x0(%rax,%rax,1)
mov    %rbx,%rdi
mov    %r15,%rsi
call   1040 <DoubleReferenceDct1D@plt>
add    $0x40,%r15
add    $0x40,%rbx
cmp    %r12,%rbx
jb     1300 <ReferenceDct+0x1e0>
lea    0x200(%rsp),%r15
mov    %rsp,%rbx
mov    %r15,%rdi
mov    %rbx,%rsi
call   1030 <DoubleTransposeMatrix@plt>
xchg   %ax,%ax
mov    %rbx,%rdi
mov    %r15,%rsi
call   1040 <DoubleReferenceDct1D@plt>
add    $0x40,%r15
add    $0x40,%rbx
cmp    %r12,%rbx
jb     1330 <ReferenceDct+0x210>
lea    0x200(%rsp),%rdi
mov    %rsp,%rsi
call   1030 <DoubleTransposeMatrix@plt>
xor    %eax,%eax
movapd 0xc9e(%rip),%xmm0
movapd 0xca6(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
movapd (%rsp,%rax,8),%xmm2
xorpd  %xmm3,%xmm3
cmpltpd %xmm2,%xmm3
movapd %xmm1,%xmm4
andpd  %xmm3,%xmm4
andnpd %xmm0,%xmm3
orpd   %xmm4,%xmm3
addpd  %xmm2,%xmm3
cvttpd2dq %xmm3,%xmm2
movlpd %xmm2,(%r14,%rax,4)
movapd 0x10(%rsp,%rax,8),%xmm2
xorpd  %xmm3,%xmm3
cmpltpd %xmm2,%xmm3
movapd %xmm1,%xmm4
andpd  %xmm3,%xmm4
andnpd %xmm0,%xmm3
orpd   %xmm4,%xmm3
addpd  %xmm2,%xmm3
cvttpd2dq %xmm3,%xmm2
movlpd %xmm2,0x8(%r14,%rax,4)
add    $0x4,%rax
cmp    $0x40,%rax
jne    1370 <ReferenceDct+0x250>
add    $0x408,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@ReferenceDct.RoutineName = internal global [13 x i8] c"ReferenceDct\00"
define void @ReferenceDct(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca double*
%7 = alloca double*
%8 = alloca [64 x double]
%9 = alloca [64 x double]
store i32* %0, i32** %3
store i32* %1, i32** %4
%10 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
store double* %10, double** %6
%11 = load i32*, i32** %3
store i32* %11, i32** %5
br label %12
12: ; preds = %23, %2
%13 = load i32*, i32** %5
%14 = load i32*, i32** %3
%15 = getelementptr inbounds i32, i32* %14, i64 64
%16 = icmp ult i32* %13, %15
br i1 %16, label %17, label %26
17: ; preds = %12
%18 = load i32*, i32** %5
%19 = load i32, i32* %18
%20 = sitofp i32 %19 to double
%21 = load double*, double** %6
%22 = getelementptr inbounds double, double* %21, i32 1
store double* %22, double** %6
store double %20, double* %21
br label %23
23: ; preds = %17
%24 = load i32*, i32** %5
%25 = getelementptr inbounds i32, i32* %24, i32 1
store i32* %25, i32** %5
br label %12
26: ; preds = %12
%27 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 0
store double* %27, double** %7
%28 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
store double* %28, double** %6
br label %29
29: ; preds = %40, %26
%30 = load double*, double** %6
%31 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
%32 = getelementptr inbounds double, double* %31, i64 64
%33 = icmp ult double* %30, %32
br i1 %33, label %34, label %43
34: ; preds = %29
%35 = load double*, double** %6
%36 = load double*, double** %7
%37 = call i32 @DoubleReferenceDct1D(double* %35, double* %36)
%38 = load double*, double** %7
%39 = getelementptr inbounds double, double* %38, i64 8
store double* %39, double** %7
br label %40
40: ; preds = %34
%41 = load double*, double** %6
%42 = getelementptr inbounds double, double* %41, i64 8
store double* %42, double** %6
br label %29
43: ; preds = %29
%44 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 0
%45 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
%46 = call i32 @DoubleTransposeMatrix(double* %44, double* %45)
%47 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 0
store double* %47, double** %7
%48 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
store double* %48, double** %6
br label %49
49: ; preds = %60, %43
%50 = load double*, double** %6
%51 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
%52 = getelementptr inbounds double, double* %51, i64 64
%53 = icmp ult double* %50, %52
br i1 %53, label %54, label %63
54: ; preds = %49
%55 = load double*, double** %6
%56 = load double*, double** %7
%57 = call i32 @DoubleReferenceDct1D(double* %55, double* %56)
%58 = load double*, double** %7
%59 = getelementptr inbounds double, double* %58, i64 8
store double* %59, double** %7
br label %60
60: ; preds = %54
%61 = load double*, double** %6
%62 = getelementptr inbounds double, double* %61, i64 8
store double* %62, double** %6
br label %49
63: ; preds = %49
%64 = getelementptr inbounds [64 x double], [64 x double]* %9, i64 0, i64 0
%65 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
%66 = call i32 @DoubleTransposeMatrix(double* %64, double* %65)
%67 = getelementptr inbounds [64 x double], [64 x double]* %8, i64 0, i64 0
store double* %67, double** %6
%68 = load i32*, i32** %4
store i32* %68, i32** %5
br label %69
69: ; preds = %91, %63
%70 = load i32*, i32** %5
%71 = load i32*, i32** %4
%72 = getelementptr inbounds i32, i32* %71, i64 64
%73 = icmp ult i32* %70, %72
br i1 %73, label %74, label %94
74: ; preds = %69
%75 = load double*, double** %6
%76 = load double, double* %75
%77 = fcmp ogt double %76, 0.000000e+00
br i1 %77, label %78, label %82
78: ; preds = %74
%79 = load double*, double** %6
%80 = load double, double* %79
%81 = fadd double %80, 5.000000e-01
br label %86
82: ; preds = %74
%83 = load double*, double** %6
%84 = load double, double* %83
%85 = fsub double %84, 5.000000e-01
br label %86
86: ; preds = %82, %78
%87 = phi double [ %81, %78 ], [ %85, %82 ]
%88 = fptosi double %87 to i32
%89 = load i32*, i32** %5
%90 = getelementptr inbounds i32, i32* %89, i32 1
store i32* %90, i32** %5
store i32 %88, i32* %89
br label %91
91: ; preds = %86
%92 = load double*, double** %6
%93 = getelementptr inbounds double, double* %92, i32 1
store double* %93, double** %6
br label %69
94: ; preds = %69
ret void
}

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