// File: EmbeddedPaul166[P]SNMP-Agent/src/coder.cpp
// Function: Coder::encodeID(DataType&)
std::byte Coder::encodeID(DataType & dataType)
{
    std::byte encoding = static_cast<std::byte>(0);
    
    std::byte visibilityApplicationMask = static_cast<std::byte>(0x40);
    std::byte visibilityContextSpecificMask = static_cast<std::byte>(0x80);
    std::byte visibilityPrivateMask = static_cast<std::byte>(0xC0);
    
    std::byte complexityConstructedMask = static_cast<std::byte>(0x20);
    
    std::byte tagIntegerMask = static_cast<std::byte>(0x02);
    std::byte tagOctetStringMask = static_cast<std::byte>(0x04);
    std::byte tagObjectIdentifierMask = static_cast<std::byte>(0x06);
    std::byte tagBooleanMask = static_cast<std::byte>(0x01);
    std::byte tagNullMask = static_cast<std::byte>(0x05);
    std::byte tagSequenceOfMask = static_cast<std::byte>(0x10);
    
    if (dataType.m_visibility == DataVisibility::APPLICATION)
    {
        encoding |= visibilityApplicationMask;    
    }
    else if (dataType.m_visibility == DataVisibility::CONTEXT_SPECIFIC)
    {
        encoding |= visibilityContextSpecificMask;
    }
    else if (dataType.m_visibility == DataVisibility::PRIVATE)
    {
        encoding |= visibilityPrivateMask;
    }
    
    if (dataType.m_complexity == EncodingComplexity::CONSTRUCTED)
    {
        encoding |= complexityConstructedMask;      
    }
    
    if (dataType.m_baseType == BaseDataType::INTEGER)
    {
        encoding |= tagIntegerMask;
    }
    else if (dataType.m_baseType == BaseDataType::OCTET_STRING)
    {
        encoding |= tagOctetStringMask;
    }
    else if (dataType.m_baseType == BaseDataType::OBJECT_IDENTIFIER)
    {
        encoding |= tagObjectIdentifierMask;
    }
    else if (dataType.m_baseType == BaseDataType::BOOLEAN)
    {
        encoding |= tagBooleanMask;
    }
    else if (dataType.m_baseType == BaseDataType::NULL_D)
    {
        encoding |= tagNullMask;
    }
    else if (dataType.m_baseType == BaseDataType::SEQUENCE_OF)
    {
        encoding |= tagSequenceOfMask;
    }
    
    return encoding;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x58, %rsp
movq %rdi, -0xc0(%rbp)
movq %rsi, -0xc8(%rbp)
movb $0x0, -0xc9(%rbp)
movb $0x40, -0xca(%rbp)
movb $-0x80, -0xcb(%rbp)
movb $-0x40, -0xcc(%rbp)
movb $0x20, -0xcd(%rbp)
movb $0x2, -0xce(%rbp)
movb $0x4, -0xcf(%rbp)
movb $0x6, -0xd0(%rbp)
movb $0x1, -0xd1(%rbp)
movb $0x5, -0xd2(%rbp)
movb $0x10, -0xd3(%rbp)
movq -0xc8(%rbp), %rax
cmpl $0x1, 0xc(%rax)
jne 0xffca
movb -0xca(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x20(%rbp)
movb %al, -0x21(%rbp)
movq -0x20(%rbp), %rax
movb (%rax), %cl
movb -0x21(%rbp), %al
movb %cl, -0x13(%rbp)
movb %al, -0x14(%rbp)
movzbl -0x13(%rbp), %eax
movzbl -0x14(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x20(%rbp), %rax
movb %cl, (%rax)
jmp 0x10054
movq -0xc8(%rbp), %rax
cmpl $0x2, 0xc(%rax)
jne 0x1000e
movb -0xcb(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x30(%rbp)
movb %al, -0x31(%rbp)
movq -0x30(%rbp), %rax
movb (%rax), %cl
movb -0x31(%rbp), %al
movb %cl, -0x11(%rbp)
movb %al, -0x12(%rbp)
movzbl -0x11(%rbp), %eax
movzbl -0x12(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x30(%rbp), %rax
movb %cl, (%rax)
jmp 0x10052
movq -0xc8(%rbp), %rax
cmpl $0x3, 0xc(%rax)
jne 0x10050
movb -0xcc(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x40(%rbp)
movb %al, -0x41(%rbp)
movq -0x40(%rbp), %rax
movb (%rax), %cl
movb -0x41(%rbp), %al
movb %cl, -0xf(%rbp)
movb %al, -0x10(%rbp)
movzbl -0xf(%rbp), %eax
movzbl -0x10(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x40(%rbp), %rax
movb %cl, (%rax)
jmp 0x10052
jmp 0x10054
movq -0xc8(%rbp), %rax
cmpl $0x1, 0x4(%rax)
jne 0x10096
movb -0xcd(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x50(%rbp)
movb %al, -0x51(%rbp)
movq -0x50(%rbp), %rax
movb (%rax), %cl
movb -0x51(%rbp), %al
movb %cl, -0xd(%rbp)
movb %al, -0xe(%rbp)
movzbl -0xd(%rbp), %eax
movzbl -0xe(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x50(%rbp), %rax
movb %cl, (%rax)
movq -0xc8(%rbp), %rax
cmpl $0x0, (%rax)
jne 0x100dc
movb -0xce(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x60(%rbp)
movb %al, -0x61(%rbp)
movq -0x60(%rbp), %rax
movb (%rax), %cl
movb -0x61(%rbp), %al
movb %cl, -0xb(%rbp)
movb %al, -0xc(%rbp)
movzbl -0xb(%rbp), %eax
movzbl -0xc(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x60(%rbp), %rax
movb %cl, (%rax)
jmp 0x1026f
movq -0xc8(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x10122
movb -0xcf(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x70(%rbp)
movb %al, -0x71(%rbp)
movq -0x70(%rbp), %rax
movb (%rax), %cl
movb -0x71(%rbp), %al
movb %cl, -0x9(%rbp)
movb %al, -0xa(%rbp)
movzbl -0x9(%rbp), %eax
movzbl -0xa(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x70(%rbp), %rax
movb %cl, (%rax)
jmp 0x1026d
movq -0xc8(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x1016e
movb -0xd0(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x80(%rbp)
movb %al, -0x81(%rbp)
movq -0x80(%rbp), %rax
movb (%rax), %cl
movb -0x81(%rbp), %al
movb %cl, -0x7(%rbp)
movb %al, -0x8(%rbp)
movzbl -0x7(%rbp), %eax
movzbl -0x8(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x80(%rbp), %rax
movb %cl, (%rax)
jmp 0x1026b
movq -0xc8(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x101c3
movb -0xd1(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0x90(%rbp)
movb %al, -0x91(%rbp)
movq -0x90(%rbp), %rax
movb (%rax), %cl
movb -0x91(%rbp), %al
movb %cl, -0x5(%rbp)
movb %al, -0x6(%rbp)
movzbl -0x5(%rbp), %eax
movzbl -0x6(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0x90(%rbp), %rax
movb %cl, (%rax)
jmp 0x10269
movq -0xc8(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x10215
movb -0xd2(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0xa0(%rbp)
movb %al, -0xa1(%rbp)
movq -0xa0(%rbp), %rax
movb (%rax), %cl
movb -0xa1(%rbp), %al
movb %cl, -0x3(%rbp)
movb %al, -0x4(%rbp)
movzbl -0x3(%rbp), %eax
movzbl -0x4(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0xa0(%rbp), %rax
movb %cl, (%rax)
jmp 0x10267
movq -0xc8(%rbp), %rax
cmpl $0x6, (%rax)
jne 0x10265
movb -0xd3(%rbp), %al
leaq -0xc9(%rbp), %rcx
movq %rcx, -0xb0(%rbp)
movb %al, -0xb1(%rbp)
movq -0xb0(%rbp), %rax
movb (%rax), %cl
movb -0xb1(%rbp), %al
movb %cl, -0x1(%rbp)
movb %al, -0x2(%rbp)
movzbl -0x1(%rbp), %eax
movzbl -0x2(%rbp), %ecx
orl %ecx, %eax
movb %al, %cl
movq -0xb0(%rbp), %rax
movb %cl, (%rax)
jmp 0x10267
jmp 0x10269
jmp 0x1026b
jmp 0x1026d
jmp 0x1026f
movb -0xc9(%rbp), %al
addq $0x58, %rsp
popq %rbp
retq
nopl (%rax,%rax)