// File: kebwi[P]Trifid/src/FFT/fftlib.cpp
// Function: ifft8pt(double*, double)
inline void ifft8pt(Float_t *ioptr, Float_t scale){
/***   RADIX 8 ifft	***/
Float_t w0r = 1.0/MYROOT2; /* cos(pi/4)	*/
Float_t f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i;
Float_t f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i;
Float_t t0r, t0i, t1r, t1i;
const Float_t Two = 2.0;

	/* bit reversed load */
f0r = ioptr[0];
f0i = ioptr[1];
f1r = ioptr[8];
f1i = ioptr[9];
f2r = ioptr[4];
f2i = ioptr[5];
f3r = ioptr[12];
f3i = ioptr[13];
f4r = ioptr[2];
f4i = ioptr[3];
f5r = ioptr[10];
f5i = ioptr[11];
f6r = ioptr[6];
f6i = ioptr[7];
f7r = ioptr[14];
f7i = ioptr[15];

			/* Butterflys		*/
			/*
			f0	-	-	t0	-	-	f0	-	-	f0
			f1	-  1 -	f1	-	-	f1	-	-	f1
			f2	-	-	f2	-  1 -	f2	-	-	f2
			f3	-  1 -	t1	-  i -	f3	-	-	f3
			f4	-	-	t0	-	-	f4	-  1 -	t0
			f5	-  1 -	f5	-	-	f5	- w3 -	f4
			f6	-	-	f6	-  1 -	f6	-  i -	t1
			f7	-  1 -	t1	-  i -	f7	- iw3-	f6
			*/

t0r = f0r + f1r;
t0i = f0i + f1i;
f1r = f0r - f1r;
f1i = f0i - f1i;

t1r = f2r - f3r;
t1i = f2i - f3i;
f2r = f2r + f3r;
f2i = f2i + f3i;

f0r = t0r + f2r;
f0i = t0i + f2i;
f2r = t0r - f2r;
f2i = t0i - f2i;

f3r = f1r + t1i;
f3i = f1i - t1r;
f1r = f1r - t1i;
f1i = f1i + t1r;


t0r = f4r + f5r;
t0i = f4i + f5i;
f5r = f4r - f5r;
f5i = f4i - f5i;

t1r = f6r - f7r;
t1i = f6i - f7i;
f6r = f6r + f7r;
f6i = f6i + f7i;

f4r = t0r + f6r;
f4i = t0i + f6i;
f6r = t0r - f6r;
f6i = t0i - f6i;

f7r = f5r + t1i;
f7i = f5i - t1r;
f5r = f5r - t1i;
f5i = f5i + t1r;


t0r = f0r - f4r;
t0i = f0i - f4i;
f0r = f0r + f4r;
f0i = f0i + f4i;

t1r = f2r + f6i;
t1i = f2i - f6r;
f2r = f2r - f6i;
f2i = f2i + f6r;

f4r = f1r - f5r * w0r + f5i * w0r;
f4i = f1i - f5r * w0r - f5i * w0r;
f1r = f1r * Two - f4r;
f1i = f1i * Two - f4i;

f6r = f3r + f7r * w0r + f7i * w0r;
f6i = f3i - f7r * w0r + f7i * w0r;
f3r = f3r * Two - f6r;
f3i = f3i * Two - f6i;

	/* store result */
ioptr[0] = scale*f0r;
ioptr[1] = scale*f0i;
ioptr[2] = scale*f1r;
ioptr[3] = scale*f1i;
ioptr[4] = scale*f2r;
ioptr[5] = scale*f2i;
ioptr[6] = scale*f3r;
ioptr[7] = scale*f3i;
ioptr[8] = scale*t0r;
ioptr[9] = scale*t0i;
ioptr[10] = scale*f4r;
ioptr[11] = scale*f4i;
ioptr[12] = scale*t1r;
ioptr[13] = scale*t1i;
ioptr[14] = scale*f6r;
ioptr[15] = scale*f6i;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movsd %xmm0, -0x10(%rbp)
movsd 0xae7f(%rip), %xmm0     # 0x4d9c8
movsd %xmm0, -0x18(%rbp)
movsd 0x79f2(%rip), %xmm0     # 0x4a548
movsd %xmm0, -0xc0(%rbp)
movq -0x8(%rbp), %rax
movsd (%rax), %xmm0
movsd %xmm0, -0x20(%rbp)
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movsd %xmm0, -0x28(%rbp)
movq -0x8(%rbp), %rax
movsd 0x40(%rax), %xmm0
movsd %xmm0, -0x30(%rbp)
movq -0x8(%rbp), %rax
movsd 0x48(%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
movq -0x8(%rbp), %rax
movsd 0x20(%rax), %xmm0
movsd %xmm0, -0x40(%rbp)
movq -0x8(%rbp), %rax
movsd 0x28(%rax), %xmm0
movsd %xmm0, -0x48(%rbp)
movq -0x8(%rbp), %rax
movsd 0x60(%rax), %xmm0
movsd %xmm0, -0x50(%rbp)
movq -0x8(%rbp), %rax
movsd 0x68(%rax), %xmm0
movsd %xmm0, -0x58(%rbp)
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x8(%rbp), %rax
movsd 0x18(%rax), %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x8(%rbp), %rax
movsd 0x50(%rax), %xmm0
movsd %xmm0, -0x70(%rbp)
movq -0x8(%rbp), %rax
movsd 0x58(%rax), %xmm0
movsd %xmm0, -0x78(%rbp)
movq -0x8(%rbp), %rax
movsd 0x30(%rax), %xmm0
movsd %xmm0, -0x80(%rbp)
movq -0x8(%rbp), %rax
movsd 0x38(%rax), %xmm0
movsd %xmm0, -0x88(%rbp)
movq -0x8(%rbp), %rax
movsd 0x70(%rax), %xmm0
movsd %xmm0, -0x90(%rbp)
movq -0x8(%rbp), %rax
movsd 0x78(%rax), %xmm0
movsd %xmm0, -0x98(%rbp)
movsd -0x20(%rbp), %xmm0
addsd -0x30(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0x28(%rbp), %xmm0
addsd -0x38(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
movsd -0x20(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x28(%rbp), %xmm0
subsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
movsd -0x40(%rbp), %xmm0
subsd -0x50(%rbp), %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0x48(%rbp), %xmm0
subsd -0x58(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0x40(%rbp), %xmm0
addsd -0x50(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x48(%rbp), %xmm0
addsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0xa0(%rbp), %xmm0
addsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movsd -0xa8(%rbp), %xmm0
addsd -0x48(%rbp), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0xa0(%rbp), %xmm0
subsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0xa8(%rbp), %xmm0
subsd -0x48(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x30(%rbp), %xmm0
addsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x38(%rbp), %xmm0
subsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x30(%rbp), %xmm0
subsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x38(%rbp), %xmm0
addsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x38(%rbp)
movsd -0x60(%rbp), %xmm0
addsd -0x70(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0x68(%rbp), %xmm0
addsd -0x78(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
movsd -0x60(%rbp), %xmm0
subsd -0x70(%rbp), %xmm0
movsd %xmm0, -0x70(%rbp)
movsd -0x68(%rbp), %xmm0
subsd -0x78(%rbp), %xmm0
movsd %xmm0, -0x78(%rbp)
movsd -0x80(%rbp), %xmm0
subsd -0x90(%rbp), %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0x88(%rbp), %xmm0
subsd -0x98(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0x80(%rbp), %xmm0
addsd -0x90(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0x88(%rbp), %xmm0
addsd -0x98(%rbp), %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0xa0(%rbp), %xmm0
addsd -0x80(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0xa8(%rbp), %xmm0
addsd -0x88(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movsd -0xa0(%rbp), %xmm0
subsd -0x80(%rbp), %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0xa8(%rbp), %xmm0
subsd -0x88(%rbp), %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0x70(%rbp), %xmm0
addsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x90(%rbp)
movsd -0x78(%rbp), %xmm0
subsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
movsd -0x70(%rbp), %xmm0
subsd -0xb8(%rbp), %xmm0
movsd %xmm0, -0x70(%rbp)
movsd -0x78(%rbp), %xmm0
addsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x78(%rbp)
movsd -0x20(%rbp), %xmm0
subsd -0x60(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0x28(%rbp), %xmm0
subsd -0x68(%rbp), %xmm0
movsd %xmm0, -0xa8(%rbp)
movsd -0x20(%rbp), %xmm0
addsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movsd -0x28(%rbp), %xmm0
addsd -0x68(%rbp), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x40(%rbp), %xmm0
addsd -0x88(%rbp), %xmm0
movsd %xmm0, -0xb0(%rbp)
movsd -0x48(%rbp), %xmm0
subsd -0x80(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0x40(%rbp), %xmm0
subsd -0x88(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x48(%rbp), %xmm0
addsd -0x80(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x30(%rbp), %xmm0
movsd -0x70(%rbp), %xmm1
movsd -0x18(%rbp), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x78(%rbp), %xmm0
movsd -0x18(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x38(%rbp), %xmm0
movsd -0x70(%rbp), %xmm1
movsd -0x18(%rbp), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x78(%rbp), %xmm0
movsd -0x18(%rbp), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x68(%rbp)
movsd -0x30(%rbp), %xmm0
movsd -0x60(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x38(%rbp), %xmm0
movsd -0x68(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movsd -0x50(%rbp), %xmm0
movsd -0x90(%rbp), %xmm1
movsd -0x18(%rbp), %xmm2
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x98(%rbp), %xmm0
movsd -0x18(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x80(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x90(%rbp), %xmm1
movsd -0x18(%rbp), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x98(%rbp), %xmm0
movsd -0x18(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x88(%rbp)
movsd -0x50(%rbp), %xmm0
movsd -0x80(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x58(%rbp), %xmm0
movsd -0x88(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
addsd %xmm0, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x10(%rbp), %xmm0
mulsd -0x20(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x28(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x30(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x10(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x38(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x18(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x40(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x20(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x48(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x28(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x50(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x30(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x58(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x38(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0xa0(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x40(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0xa8(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x48(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x60(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x50(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x68(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x58(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0xb0(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x60(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0xb8(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x68(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x80(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x70(%rax)
movsd -0x10(%rbp), %xmm0
mulsd -0x88(%rbp), %xmm0
movq -0x8(%rbp), %rax
movsd %xmm0, 0x78(%rax)
addq $0x40, %rsp
popq %rbp
retq
nop