// File: 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
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x8(%rbp)
movsd %xmm0, -0x10(%rbp)
movsd %xmm1, -0x18(%rbp)
movsd %xmm2, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xf8(%rbp)
movsd -0x10(%rbp), %xmm0
callq 0x22d0
movsd %xmm0, -0x28(%rbp)
movsd -0x18(%rbp), %xmm0
callq 0x22d0
movsd %xmm0, -0x30(%rbp)
movsd -0x20(%rbp), %xmm0
callq 0x22d0
movsd %xmm0, -0x38(%rbp)
cvttsd2si -0x28(%rbp), %eax
andl $0xff, %eax
movl %eax, -0x3c(%rbp)
cvttsd2si -0x30(%rbp), %eax
andl $0xff, %eax
movl %eax, -0x40(%rbp)
cvttsd2si -0x38(%rbp), %eax
andl $0xff, %eax
movl %eax, -0x44(%rbp)
movsd -0x10(%rbp), %xmm0
subsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x18(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x20(%rbp), %xmm0
subsd -0x38(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x50(%rbp), %xmm0
callq 0x54d0
movsd %xmm0, -0x68(%rbp)
movsd -0x58(%rbp), %xmm0
callq 0x54d0
movsd %xmm0, -0x70(%rbp)
movsd -0x60(%rbp), %xmm0
callq 0x54d0
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0x78(%rbp)
movl -0x3c(%rbp), %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movq -0xf8(%rbp), %rdi
movzbl (%rax), %eax
addl -0x40(%rbp), %eax
andl $0xff, %eax
movb %al, -0x79(%rbp)
movl -0x3c(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movq -0xf8(%rbp), %rdi
movzbl (%rax), %eax
addl -0x40(%rbp), %eax
andl $0xff, %eax
movb %al, -0x7a(%rbp)
movzbl -0x79(%rbp), %eax
movl %eax, %esi
callq 0x5520
movq -0xf8(%rbp), %rdi
movzbl (%rax), %eax
addl -0x44(%rbp), %eax
andl $0xff, %eax
movb %al, -0x7b(%rbp)
movzbl -0x79(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movq -0xf8(%rbp), %rdi
movzbl (%rax), %eax
addl -0x44(%rbp), %eax
andl $0xff, %eax
movb %al, -0x7c(%rbp)
movzbl -0x7a(%rbp), %eax
movl %eax, %esi
callq 0x5520
movq -0xf8(%rbp), %rdi
movzbl (%rax), %eax
addl -0x44(%rbp), %eax
andl $0xff, %eax
movb %al, -0x7d(%rbp)
movzbl -0x7a(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movq -0xf8(%rbp), %rdi
movzbl (%rax), %eax
addl -0x44(%rbp), %eax
andl $0xff, %eax
movb %al, -0x7e(%rbp)
movzbl -0x7b(%rbp), %eax
movl %eax, %esi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movsd -0x60(%rbp), %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0x88(%rbp)
movzbl -0x7d(%rbp), %eax
movl %eax, %esi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd 0xe56(%rip), %xmm1      # 0x6030
subsd %xmm1, %xmm0
movsd -0x58(%rbp), %xmm1
movsd -0x60(%rbp), %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0x90(%rbp)
movzbl -0x7c(%rbp), %eax
movl %eax, %esi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movsd 0xe12(%rip), %xmm2      # 0x6030
subsd %xmm2, %xmm1
movsd -0x60(%rbp), %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0x98(%rbp)
movzbl -0x7e(%rbp), %eax
movl %eax, %esi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd 0xdd8(%rip), %xmm1      # 0x6030
subsd %xmm1, %xmm0
movsd -0x58(%rbp), %xmm1
movsd 0xdc7(%rip), %xmm2      # 0x6030
subsd %xmm2, %xmm1
movsd -0x60(%rbp), %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0xa0(%rbp)
movzbl -0x7b(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movsd -0x60(%rbp), %xmm2
movsd 0xd7a(%rip), %xmm3      # 0x6030
subsd %xmm3, %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0xa8(%rbp)
movzbl -0x7d(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd 0xd3c(%rip), %xmm1      # 0x6030
subsd %xmm1, %xmm0
movsd -0x58(%rbp), %xmm1
movsd -0x60(%rbp), %xmm2
movsd 0xd26(%rip), %xmm3      # 0x6030
subsd %xmm3, %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0xb0(%rbp)
movzbl -0x7c(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
movsd 0xce3(%rip), %xmm2      # 0x6030
subsd %xmm2, %xmm1
movsd -0x60(%rbp), %xmm2
movsd 0xcd2(%rip), %xmm3      # 0x6030
subsd %xmm3, %xmm2
movzbl %al, %edi
callq 0x5550
movq -0xf8(%rbp), %rdi
movsd %xmm0, -0xb8(%rbp)
movzbl -0x7e(%rbp), %eax
addl $0x1, %eax
andl $0xff, %eax
movslq %eax, %rsi
callq 0x5520
movb (%rax), %al
movsd -0x50(%rbp), %xmm0
movsd 0xc94(%rip), %xmm1      # 0x6030
subsd %xmm1, %xmm0
movsd -0x58(%rbp), %xmm1
movsd 0xc83(%rip), %xmm2      # 0x6030
subsd %xmm2, %xmm1
movsd -0x60(%rbp), %xmm2
movsd 0xc72(%rip), %xmm3      # 0x6030
subsd %xmm3, %xmm2
movzbl %al, %edi
callq 0x5550
movsd %xmm0, -0xc0(%rbp)
movsd -0x88(%rbp), %xmm0
movsd -0x90(%rbp), %xmm1
movsd -0x68(%rbp), %xmm2
callq 0x5680
movsd %xmm0, -0xc8(%rbp)
movsd -0x98(%rbp), %xmm0
movsd -0xa0(%rbp), %xmm1
movsd -0x68(%rbp), %xmm2
callq 0x5680
movsd %xmm0, -0xd0(%rbp)
movsd -0xa8(%rbp), %xmm0
movsd -0xb0(%rbp), %xmm1
movsd -0x68(%rbp), %xmm2
callq 0x5680
movsd %xmm0, -0xd8(%rbp)
movsd -0xb8(%rbp), %xmm0
movsd -0xc0(%rbp), %xmm1
movsd -0x68(%rbp), %xmm2
callq 0x5680
movsd %xmm0, -0xe0(%rbp)
movsd -0xc8(%rbp), %xmm0
movsd -0xd0(%rbp), %xmm1
movsd -0x70(%rbp), %xmm2
callq 0x5680
movsd %xmm0, -0xe8(%rbp)
movsd -0xd8(%rbp), %xmm0
movsd -0xe0(%rbp), %xmm1
movsd -0x70(%rbp), %xmm2
callq 0x5680
movsd %xmm0, -0xf0(%rbp)
movsd -0xe8(%rbp), %xmm0
movsd -0xf0(%rbp), %xmm1
movsd -0x78(%rbp), %xmm2
callq 0x5680
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax,%rax)