// File: /workspace/github_cpp_makefile_star2_O2/Reputeless[P]PerlinNoise/./PerlinNoise.hpp
// Function: siv::BasicPerlinNoise<double>::noise3D(double, double, double) const
inline typename BasicPerlinNoise<Float>::value_type BasicPerlinNoise<Float>::noise3D(const value_type x, const value_type y, const value_type z) const noexcept
	{
		const value_type _x = std::floor(x);
		const value_type _y = std::floor(y);
		const value_type _z = std::floor(z);

		const std::int32_t ix = static_cast<std::int32_t>(_x) & 255;
		const std::int32_t iy = static_cast<std::int32_t>(_y) & 255;
		const std::int32_t iz = static_cast<std::int32_t>(_z) & 255;

		const value_type fx = (x - _x);
		const value_type fy = (y - _y);
		const value_type fz = (z - _z);

		const value_type u = perlin_detail::Fade(fx);
		const value_type v = perlin_detail::Fade(fy);
		const value_type w = perlin_detail::Fade(fz);

		const std::uint8_t A = (m_permutation[ix & 255] + iy) & 255;
		const std::uint8_t B = (m_permutation[(ix + 1) & 255] + iy) & 255;

		const std::uint8_t AA = (m_permutation[A] + iz) & 255;
		const std::uint8_t AB = (m_permutation[(A + 1) & 255] + iz) & 255;

		const std::uint8_t BA = (m_permutation[B] + iz) & 255;
		const std::uint8_t BB = (m_permutation[(B + 1) & 255] + iz) & 255;

		const value_type p0 = perlin_detail::Grad(m_permutation[AA], fx, fy, fz);
		const value_type p1 = perlin_detail::Grad(m_permutation[BA], fx - 1, fy, fz);
		const value_type p2 = perlin_detail::Grad(m_permutation[AB], fx, fy - 1, fz);
		const value_type p3 = perlin_detail::Grad(m_permutation[BB], fx - 1, fy - 1, fz);
		const value_type p4 = perlin_detail::Grad(m_permutation[(AA + 1) & 255], fx, fy, fz - 1);
		const value_type p5 = perlin_detail::Grad(m_permutation[(BA + 1) & 255], fx - 1, fy, fz - 1);
		const value_type p6 = perlin_detail::Grad(m_permutation[(AB + 1) & 255], fx, fy - 1, fz - 1);
		const value_type p7 = perlin_detail::Grad(m_permutation[(BB + 1) & 255], fx - 1, fy - 1, fz - 1);

		const value_type q0 = perlin_detail::Lerp(p0, p1, u);
		const value_type q1 = perlin_detail::Lerp(p2, p3, u);
		const value_type q2 = perlin_detail::Lerp(p4, p5, u);
		const value_type q3 = perlin_detail::Lerp(p6, p7, u);

		const value_type r0 = perlin_detail::Lerp(q0, q1, v);
		const value_type r1 = perlin_detail::Lerp(q2, q3, v);

		return perlin_detail::Lerp(r0, r1, w);
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x68, %rsp
movsd %xmm2, -0x30(%rbp)
movsd %xmm1, -0x38(%rbp)
movsd %xmm0, -0x40(%rbp)
movq %rdi, %rbx
callq 0x2210
movsd %xmm0, -0x50(%rbp)
movsd -0x38(%rbp), %xmm0
callq 0x2210
movsd %xmm0, -0x48(%rbp)
movsd -0x30(%rbp), %xmm0
callq 0x2210
movsd -0x50(%rbp), %xmm1
cvttsd2si %xmm1, %ecx
movl $0xff, %edx
movl %ecx, %esi
andl %edx, %esi
movsd -0x48(%rbp), %xmm3
cvttsd2si %xmm3, %eax
cvttsd2si %xmm0, %r14d
movsd -0x40(%rbp), %xmm2
subsd %xmm1, %xmm2
movsd -0x38(%rbp), %xmm6
subsd %xmm3, %xmm6
movsd -0x30(%rbp), %xmm7
subsd %xmm0, %xmm7
movapd %xmm2, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm2, %xmm5
movsd 0xc5d(%rip), %xmm3      # 0x4058
movapd %xmm2, %xmm4
mulsd %xmm3, %xmm4
movsd 0xc55(%rip), %xmm1      # 0x4060
addsd %xmm1, %xmm4
mulsd %xmm2, %xmm4
movapd %xmm2, %xmm0
movsd %xmm2, -0x40(%rbp)
movsd 0xc04(%rip), %xmm2      # 0x4028
addsd %xmm2, %xmm4
mulsd %xmm5, %xmm4
movsd %xmm4, -0x80(%rbp)
movapd %xmm6, %xmm4
movapd %xmm6, %xmm5
mulsd %xmm6, %xmm5
mulsd %xmm6, %xmm5
mulsd %xmm3, %xmm4
addsd %xmm1, %xmm4
mulsd %xmm6, %xmm4
movsd %xmm6, -0x38(%rbp)
addsd %xmm2, %xmm4
mulsd %xmm5, %xmm4
movsd %xmm4, -0x90(%rbp)
movapd %xmm7, %xmm5
mulsd %xmm7, %xmm5
mulsd %xmm7, %xmm5
mulsd %xmm7, %xmm3
addsd %xmm1, %xmm3
mulsd %xmm7, %xmm3
movsd %xmm7, -0x30(%rbp)
addsd %xmm2, %xmm3
mulsd %xmm5, %xmm3
movsd %xmm3, -0x88(%rbp)
movb (%rbx,%rsi), %sil
addb %al, %sil
incl %ecx
andl %edx, %ecx
addb (%rbx,%rcx), %al
movzbl %sil, %ecx
movb (%rbx,%rcx), %dl
addb %r14b, %dl
incb %cl
movzbl %cl, %ecx
movb (%rbx,%rcx), %r12b
addb %r14b, %r12b
movzbl %al, %eax
movb (%rbx,%rax), %r15b
addb %r14b, %r15b
incb %al
movzbl %al, %eax
addb (%rbx,%rax), %r14b
movzbl %dl, %r13d
movzbl (%rbx,%r13), %edi
movapd %xmm6, %xmm1
movapd %xmm7, %xmm2
callq 0x3690
movsd %xmm0, -0x78(%rbp)
movzbl %r15b, %r15d
movzbl (%rbx,%r15), %edi
movsd -0x40(%rbp), %xmm0
addsd 0xb49(%rip), %xmm0      # 0x4040
movsd %xmm0, -0x50(%rbp)
movsd -0x38(%rbp), %xmm1
movsd -0x30(%rbp), %xmm2
callq 0x3690
movsd %xmm0, -0x70(%rbp)
movzbl %r12b, %r12d
movzbl (%rbx,%r12), %edi
movsd -0x38(%rbp), %xmm1
addsd 0xb1a(%rip), %xmm1      # 0x4040
movsd %xmm1, -0x48(%rbp)
movsd -0x40(%rbp), %xmm0
movsd -0x30(%rbp), %xmm2
callq 0x3690
movsd %xmm0, -0x68(%rbp)
movzbl %r14b, %r14d
movzbl (%rbx,%r14), %edi
movsd -0x50(%rbp), %xmm0
movsd -0x48(%rbp), %xmm1
movsd -0x30(%rbp), %xmm2
callq 0x3690
movsd %xmm0, -0x60(%rbp)
incb %r13b
movzbl %r13b, %eax
movzbl (%rbx,%rax), %edi
movsd -0x30(%rbp), %xmm2
addsd 0xac7(%rip), %xmm2      # 0x4040
movsd %xmm2, -0x30(%rbp)
movsd -0x40(%rbp), %xmm0
movsd -0x38(%rbp), %xmm1
callq 0x3690
movsd %xmm0, -0x58(%rbp)
incb %r15b
movzbl %r15b, %eax
movzbl (%rbx,%rax), %edi
movsd -0x50(%rbp), %xmm0
movsd -0x38(%rbp), %xmm1
movsd -0x30(%rbp), %xmm2
callq 0x3690
movsd %xmm0, -0x38(%rbp)
incb %r12b
movzbl %r12b, %eax
movzbl (%rbx,%rax), %edi
movsd -0x40(%rbp), %xmm0
movsd -0x48(%rbp), %xmm1
movsd -0x30(%rbp), %xmm2
callq 0x3690
movsd %xmm0, -0x40(%rbp)
incb %r14b
movzbl %r14b, %eax
movzbl (%rbx,%rax), %edi
movsd -0x50(%rbp), %xmm0
movsd -0x48(%rbp), %xmm1
movsd -0x30(%rbp), %xmm2
callq 0x3690
movsd -0x70(%rbp), %xmm2
movsd -0x78(%rbp), %xmm3
subsd %xmm3, %xmm2
movsd -0x80(%rbp), %xmm1
mulsd %xmm1, %xmm2
addsd %xmm3, %xmm2
movsd -0x60(%rbp), %xmm3
movsd -0x68(%rbp), %xmm4
subsd %xmm4, %xmm3
mulsd %xmm1, %xmm3
addsd %xmm4, %xmm3
movsd -0x38(%rbp), %xmm4
movsd -0x58(%rbp), %xmm5
subsd %xmm5, %xmm4
mulsd %xmm1, %xmm4
addsd %xmm5, %xmm4
movsd -0x40(%rbp), %xmm5
subsd %xmm5, %xmm0
mulsd %xmm1, %xmm0
addsd %xmm5, %xmm0
subsd %xmm2, %xmm3
movsd -0x90(%rbp), %xmm1
mulsd %xmm1, %xmm3
addsd %xmm2, %xmm3
subsd %xmm4, %xmm0
mulsd %xmm1, %xmm0
addsd %xmm4, %xmm0
subsd %xmm3, %xmm0
mulsd -0x88(%rbp), %xmm0
addsd %xmm3, %xmm0
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq