// File: 0x0584[P]scmin-plus/src/builtin/arithmetic.cpp
// Function: builtin::_mul(std::shared_ptr<sexpr> const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::shared_ptr<sexpr>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, std::shared_ptr<sexpr>>>>&)
sexpr_t builtin::_mul(const sexpr_t& args, env_t& bindings) {
    (void)bindings;
    sexpr_t walk = args;
    double d = 1;

    while (not walk->isnil()) {
        if (not walk->car()->isnum()) {
            cerr << "fatal: operands are not numbers!" << endl;
            return nullptr;
        }
        d *= any_cast<sexpr_number>(*walk->car()->blob).n;
        walk = walk->cdr();
    }
    return num(d);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x90(%rbp)
movq %rdi, %rax
movq %rax, -0x88(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x28(%rbp), %rdi
callq 0x43d0
movsd 0xd513(%rip), %xmm0     # 0x21650
movsd %xmm0, -0x30(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x4400
movq %rax, %rdi
callq 0x7270
movb %al, -0x91(%rbp)
jmp 0x1415b
movb -0x91(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x1416c
jmp 0x142f0
leaq -0x28(%rbp), %rdi
callq 0x4400
movq %rax, %rsi
leaq -0x50(%rbp), %rdi
callq 0xb520
jmp 0x14183
leaq -0x50(%rbp), %rdi
callq 0x4400
movq %rax, %rdi
callq 0x7430
movb %al, -0x92(%rbp)
jmp 0x1419c
movb -0x92(%rbp), %al
xorb $-0x1, %al
movb %al, -0x93(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x4450
movb -0x93(%rbp), %al
testb $0x1, %al
jne 0x141bf
jmp 0x14237
movq 0x19e2a(%rip), %rdi     # 0x2dff0
leaq 0xd48b(%rip), %rsi      # 0x21658
callq 0x32c0
movq %rax, -0xa0(%rbp)
jmp 0x141db
movq -0xa0(%rbp), %rdi
movq 0x19da7(%rip), %rsi     # 0x2df90
callq 0x32f0
jmp 0x141f0
movq -0x90(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x4570
movl $0x1, -0x54(%rbp)
jmp 0x1430a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x14323
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x4450
jmp 0x14323
leaq -0x28(%rbp), %rdi
callq 0x4400
movq %rax, %rsi
leaq -0x70(%rbp), %rdi
callq 0xb520
jmp 0x1424e
leaq -0x70(%rbp), %rdi
callq 0x4400
movq %rax, %rdi
callq 0x4520
movq %rax, -0xa8(%rbp)
jmp 0x14268
movq -0xa8(%rbp), %rdi
callq 0x10fa0
movsd %xmm0, -0xb0(%rbp)
jmp 0x1427e
movsd -0xb0(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x60(%rbp), %xmm1
movsd -0x30(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x4450
leaq -0x28(%rbp), %rdi
callq 0x4400
movq %rax, %rsi
leaq -0x80(%rbp), %rdi
callq 0xb440
jmp 0x142be
leaq -0x28(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x4420
leaq -0x80(%rbp), %rdi
callq 0x4450
jmp 0x14142
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x4450
jmp 0x14323
movq -0x90(%rbp), %rdi
movsd -0x30(%rbp), %xmm0
callq 0x7990
jmp 0x14303
movl $0x1, -0x54(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x4450
movq -0x88(%rbp), %rax
addq $0xb0, %rsp
popq %rbp
retq
leaq -0x28(%rbp), %rdi
callq 0x4450
movq -0x38(%rbp), %rdi
callq 0x34f0
nopw %cs:(%rax,%rax)