// File: skeeto[P]elisp-ffi/ffi-glue.cc
// Function: Machine::read_array()
void read_array() {
        int type = std::cin.get();
        void* raw_ptr = stack.pop().value.ptr;
        size_t length = stack.pop().value.u64;
        out_ << '(';
        switch(type) {
        case 'u': {
            uint8_t* ptr = static_cast<uint8_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << static_cast<unsigned int>(ptr[i]) << ' ';
            }
            break;
        case 'v': {
            uint16_t* ptr = static_cast<uint16_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        case 'w': {
            uint32_t* ptr = static_cast<uint32_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        case 'x': {
            uint64_t* ptr = static_cast<uint64_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        case 'i': {
            int8_t* ptr = static_cast<int8_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << static_cast<int>(ptr[i]) << ' ';
            }
            break;
        case 'j': {
            int16_t* ptr = static_cast<int16_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        case 'k': {
            int32_t* ptr = static_cast<int32_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        case 'l': {
            int64_t* ptr = static_cast<int64_t*>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        case 'f': {
            float* ptr = static_cast<float*>(raw_ptr);
            for(size_t i = 0; i < length; i++) {
                float value = ptr[i];
                if(std::isnan(value)) {
                    out_ << "0.0e+NaN";
                } else if(std::isinf(value)) {
                    if(value < 0) {
                        out_ << "-1.0e+INF";
                    } else {
                        out_ << "1.0e+INF";
                    }
                } else {
                    out_ << value;
                }
                out_ << ' ';
            }}
            break;
        case 'd': {
            double* ptr = static_cast<double*>(raw_ptr);
            for(size_t i = 0; i < length; i++) {
                double value = ptr[i];
                if(std::isnan(value)) {
                    out_ << "0.0e+NaN";
                } else if(std::isinf(value)) {
                    if(value < 0) {
                        out_ << "-1.0e+INF";
                    } else {
                        out_ << "1.0e+INF";
                    }
                } else {
                    out_ << value;
                }
                out_ << ' ';
            }}
            break;
        case 'p': {
            void** ptr = static_cast<void**>(raw_ptr);
            for(size_t i = 0; i < length; i++)
                out_ << ptr[i] << ' ';
            }
            break;
        default:
            std::cerr << "invalid type in read_array: " << static_cast<char>(type) << std::endl;
            return;
        }
        out_ << ")\n$";
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x110, %rsp            # imm = 0x110
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x110(%rbp)
movq 0x7957(%rip), %rdi      # 0xafc8
callq 0x2210
movq -0x110(%rbp), %rdi
movl %eax, -0xc(%rbp)
callq 0x3260
movq -0x110(%rbp), %rdi
movq %rax, -0x28(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x18(%rbp)
callq 0x3260
movq %rax, %rcx
movq -0x110(%rbp), %rax
movq %rcx, -0x40(%rbp)
movq %rdx, -0x38(%rbp)
movq -0x38(%rbp), %rcx
movq %rcx, -0x30(%rbp)
movq 0x18(%rax), %rdi
movl $0x28, %esi
callq 0x2200
movl -0xc(%rbp), %eax
addl $-0x64, %eax
movl %eax, %ecx
movq %rcx, -0x108(%rbp)
subl $0x14, %eax
ja 0x3c77
movq -0x108(%rbp), %rax
leaq 0x3b51(%rip), %rcx      # 0x7240
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x18(%rbp), %rax
movq %rax, -0x48(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x3749
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x48(%rbp), %rax
movq -0x50(%rbp), %rcx
movzbl (%rax,%rcx), %esi
callq 0x2240
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x3708
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0x58(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x379f
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x58(%rbp), %rax
movq -0x60(%rbp), %rcx
movzwl (%rax,%rcx,2), %esi
callq 0x2290
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x375e
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0x68(%rbp)
movq $0x0, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x37f4
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x68(%rbp), %rax
movq -0x70(%rbp), %rcx
movl (%rax,%rcx,4), %esi
callq 0x2240
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0x70(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x70(%rbp)
jmp 0x37b4
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0x78(%rbp)
movq $0x0, -0x80(%rbp)
movq -0x80(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x384a
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x78(%rbp), %rax
movq -0x80(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x2080
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0x80(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x80(%rbp)
jmp 0x3809
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0x88(%rbp)
movq $0x0, -0x90(%rbp)
movq -0x90(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x38b5
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x88(%rbp), %rax
movq -0x90(%rbp), %rcx
movsbl (%rax,%rcx), %esi
callq 0x22a0
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0x90(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x90(%rbp)
jmp 0x3865
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0x98(%rbp)
movq $0x0, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x3920
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x98(%rbp), %rax
movq -0xa0(%rbp), %rcx
movswl (%rax,%rcx,2), %esi
callq 0x2190
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0xa0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa0(%rbp)
jmp 0x38d0
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq $0x0, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x398a
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0xa8(%rbp), %rax
movq -0xb0(%rbp), %rcx
movl (%rax,%rcx,4), %esi
callq 0x22a0
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0xb0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xb0(%rbp)
jmp 0x393b
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq $0x0, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x39f5
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0xb8(%rbp), %rax
movq -0xc0(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x22d0
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0xc0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xc0(%rbp)
jmp 0x39a5
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq $0x0, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x3aff
movq -0xc8(%rbp), %rax
movq -0xd0(%rbp), %rcx
movss (%rax,%rcx,4), %xmm0
movss %xmm0, -0xd4(%rbp)
movss -0xd4(%rbp), %xmm0
callq 0x2a90
testb $0x1, %al
jne 0x3a4f
jmp 0x3a68
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x3833(%rip), %rsi      # 0x7294
callq 0x21b0
jmp 0x3ad3
movss -0xd4(%rbp), %xmm0
callq 0x2ab0
testb $0x1, %al
jne 0x3a7b
jmp 0x3ab9
xorps %xmm0, %xmm0
ucomiss -0xd4(%rbp), %xmm0
jbe 0x3aa0
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x3804(%rip), %rsi      # 0x729d
callq 0x21b0
jmp 0x3ab7
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x37ec(%rip), %rsi      # 0x729e
callq 0x21b0
jmp 0x3ad1
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movss -0xd4(%rbp), %xmm0
callq 0x2130
jmp 0x3ad3
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x20, %esi
callq 0x2200
movq -0xd0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xd0(%rbp)
jmp 0x3a10
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq $0x0, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x3c0a
movq -0xe0(%rbp), %rax
movq -0xe8(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0xf0(%rbp)
movsd -0xf0(%rbp), %xmm0
callq 0x2ae0
testb $0x1, %al
jne 0x3b59
jmp 0x3b72
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x3729(%rip), %rsi      # 0x7294
callq 0x21b0
jmp 0x3bde
movsd -0xf0(%rbp), %xmm0
callq 0x2b00
testb $0x1, %al
jne 0x3b85
jmp 0x3bc4
xorps %xmm0, %xmm0
ucomisd -0xf0(%rbp), %xmm0
jbe 0x3bab
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x36f9(%rip), %rsi      # 0x729d
callq 0x21b0
jmp 0x3bc2
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x36e1(%rip), %rsi      # 0x729e
callq 0x21b0
jmp 0x3bdc
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movsd -0xf0(%rbp), %xmm0
callq 0x22f0
jmp 0x3bde
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movl $0x20, %esi
callq 0x2200
movq -0xe8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xe8(%rbp)
jmp 0x3b1a
jmp 0x3ca9
movq -0x18(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq $0x0, -0x100(%rbp)
movq -0x100(%rbp), %rax
cmpq -0x30(%rbp), %rax
jae 0x3c75
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0xf8(%rbp), %rax
movq -0x100(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x2150
movq %rax, %rdi
movl $0x20, %esi
callq 0x2200
movq -0x100(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x100(%rbp)
jmp 0x3c25
jmp 0x3ca9
movq 0x7372(%rip), %rdi      # 0xaff0
leaq 0x366c(%rip), %rsi      # 0x72f1
callq 0x21b0
movq %rax, %rdi
movl -0xc(%rbp), %eax
movsbl %al, %esi
callq 0x2200
movq %rax, %rdi
movq 0x72ce(%rip), %rsi      # 0xaf70
callq 0x21e0
jmp 0x3cc0
movq -0x110(%rbp), %rax
movq 0x18(%rax), %rdi
leaq 0x3653(%rip), %rsi      # 0x730e
callq 0x21b0
addq $0x110, %rsp            # imm = 0x110
popq %rbp
retq
nopl (%rax)