// File: /workspace/github_cpp_makefile_star2_O3/dechimal[P]TaggedUnion/include/desalt/datatypes/sum.hpp
// Function: void desalt::datatypes::detail::sum::sum<int, double, hoge, hoge>::assign<desalt::datatypes::detail::sum::sum<int, double, hoge, hoge> const&>(desalt::datatypes::detail::sum::sum<int, double, hoge, hoge> const&)
void assign(Union && other) {
        if (which_ == other.which_) {
            this->copy_or_move_assign(std::forward<Union>(other));
        } else {
            if (this->nothrow_constructible(std::forward<Union>(other))) {
                this->construct_using_nothrow_constructor(std::forward<Union>(other));
            } else {
                bool fallback;
                if constexpr (std::is_lvalue_reference_v<Union&&>) {
                    bool nothrow_move_constructible = other.nothrow_move_constructible();
                    if (nothrow_move_constructible) {
                        this->construct_using_right_hand_move_constructor(other);
                    }
                    fallback = !nothrow_move_constructible;
                } else {
                    fallback = true;
                }
                if (fallback) {
                    if (this->nothrow_move_constructible()) {
                        this->construct_using_auto_storage_save(std::forward<Union>(other));
                    } else if constexpr (enable_fallback) {
                        this->construct_using_fallback_type(std::forward<Union>(other));
                    } else {
                        this->construct_using_dynamic_storage_save(std::forward<Union>(other));
                    }
                }
            }
            this->set_which(other.which());
        }
    }

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rsi, %rbx
movq %rdi, %r14
movl (%rdi), %eax
movl (%rsi), %ecx
cmpl %ecx, %eax
jne 0x5151
leaq 0x8(%rsp), %rdi
movq %r14, (%rdi)
movq %rbx, 0x8(%rdi)
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
leaq 0x8807(%rip), %rcx      # 0xd950
callq *(%rcx,%rax,8)
jmp 0x5231
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
leaq 0x8812(%rip), %rax      # 0xd970
leaq 0x8(%rsp), %rdi
callq *(%rax,%rcx,8)
testb %al, %al
je 0x51a5
leaq 0x8(%rsp), %r15
movq %r14, (%r15)
movl (%r14), %eax
movl $0x7fffffff, %r12d      # imm = 0x7FFFFFFF
andq %r12, %rax
leaq 0x86cb(%rip), %rcx      # 0xd850
movq %r15, %rdi
callq *(%rcx,%rax,8)
movq %r14, (%r15)
movq %rbx, 0x8(%r15)
movl (%rbx), %eax
andq %r12, %rax
leaq 0x86d2(%rip), %rcx      # 0xd870
leaq 0x8(%rsp), %rdi
jmp 0x5224
movl (%rbx), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
leaq 0x873d(%rip), %r15      # 0xd8f0
leaq 0x8(%rsp), %rdi
callq *(%r15,%rax,8)
testb %al, %al
je 0x51dc
leaq 0x8(%rsp), %rdi
movq %rbx, (%rdi)
movq %r14, 0x8(%rdi)
movl (%rbx), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
leaq 0x87b6(%rip), %rcx      # 0xd990
jmp 0x5224
movl (%r14), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
leaq 0x8(%rsp), %rdi
callq *(%r15,%rax,8)
leaq 0x8(%rsp), %rdi
testb %al, %al
je 0x520e
movq %r14, (%rdi)
movq %rbx, 0x8(%rdi)
movl (%r14), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
leaq 0x87a4(%rip), %rcx      # 0xd9b0
jmp 0x5224
movq %r14, (%rdi)
movq %rbx, 0x8(%rdi)
movl (%r14), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
leaq 0x87ac(%rip), %rcx      # 0xd9d0
callq *(%rcx,%rax,8)
movl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
andl (%rbx), %eax
movl %eax, (%r14)
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
nop