// File: /workspace/github_c_makefile_star2_O0/BernardTatin[P]s7sh/s7.c
// Function: opt_arg_type
static s7_pointer opt_arg_type(s7_scheme *sc, s7_pointer argp)
                {
                    s7_pointer arg, slot;
                    arg = car(argp);
                    if (is_pair(arg))
                    {
                        if (is_symbol(car(arg)))
                        {
                            if ((is_global(car(arg))) ||
                                    ((is_slot(global_slot(car(arg)))) &&
                                     (symbol_to_slot(sc, car(arg)) == global_slot(car(arg)))))
                            {
                                s7_pointer a_func;
                                a_func = slot_value(global_slot(car(arg)));
                                if (is_c_function(a_func))
                                {
                                    s7_pointer sig;
                                    sig = c_function_signature(a_func);
                                    if (is_pair(sig))
                                    {
                                        if ((car(sig) == sc->is_integer_symbol) ||
                                                ((is_pair(car(sig))) && (direct_memq(sc->is_integer_symbol, car(sig)))))
                                            return(sc->is_integer_symbol);
                                        if ((car(sig) == sc->is_float_symbol) ||
                                                ((is_pair(car(sig))) && (direct_memq(sc->is_float_symbol, car(sig)))))
                                            return(sc->is_float_symbol);
                                        if ((car(sig) == sc->is_real_symbol) ||
                                                (car(sig) == sc->is_number_symbol))
                                        {
                                            int32_t start;
                                            start = sc->pc;
                                            if (int_optimize(sc, argp))
                                            {
                                                pc_fallback(sc, start);
                                                return(sc->is_integer_symbol);
                                            }
                                            if (float_optimize(sc, argp))
                                            {
                                                pc_fallback(sc, start);
                                                return(sc->is_float_symbol);
                                            }
                                            pc_fallback(sc, start);
                                        }
                                        return(car(sig)); /* we want the function's return type in this context */
                                    }
                                }
                            }
                            slot = symbol_to_slot(sc, car(arg));
                            if ((is_slot(slot)) &&
                                    (is_sequence(slot_value(slot))))
                            {
                                s7_pointer sig;
                                sig = s7_signature(sc, slot_value(slot));
                                if (is_pair(sig))
                                    return(car(sig));
                            }
                        }
                        return(sc->T);
                    }
                    if (is_symbol(arg))
                    {
                        slot = opt_simple_symbol(sc, arg);
                        if (!slot) return(sc->T);
                        return(s7_type_of(sc, slot_value(slot)));
                    }
                    return(s7_type_of(sc, arg));
                }

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x38(%rsp)
movq %rsi, 0x30(%rsp)
movq 0x30(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
jne 0xf5cab
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movzbl (%rax), %eax
cmpl $0xa, %eax
jne 0xf5c98
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
andq $0x10000, %rax          # imm = 0x10000
cmpq $0x0, %rax
jne 0xf5a29
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
cmpl $0x20, %eax
jne 0xf5c07
movq 0x38(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0xfc80
movq 0x28(%rsp), %rcx
movq 0x8(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jne 0xf5c07
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x30, %eax
jl 0xf5c05
movq 0x18(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x38(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
jne 0xf5c03
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x38(%rsp), %rcx
cmpq 0x10d0(%rcx), %rax
je 0xf5abb
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
jne 0xf5ad1
movq 0x38(%rsp), %rax
movq 0x10d0(%rax), %rdi
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0xde1a0
testb $0x1, %al
jne 0xf5abb
jmp 0xf5ad1
movq 0x38(%rsp), %rax
movq 0x10d0(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x38(%rsp), %rcx
cmpq 0x11e0(%rcx), %rax
je 0xf5b19
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
jne 0xf5b2f
movq 0x38(%rsp), %rax
movq 0x11e0(%rax), %rdi
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0xde1a0
testb $0x1, %al
jne 0xf5b19
jmp 0xf5b2f
movq 0x38(%rsp), %rax
movq 0x11e0(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x38(%rsp), %rcx
cmpq 0x1180(%rcx), %rax
je 0xf5b61
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movq 0x38(%rsp), %rcx
cmpq 0x1120(%rcx), %rax
jne 0xf5bf0
movq 0x38(%rsp), %rax
movl 0x2258(%rax), %eax
movl %eax, 0xc(%rsp)
movq 0x38(%rsp), %rdi
movq 0x30(%rsp), %rsi
callq 0xe59c0
testb $0x1, %al
jne 0xf5b85
jmp 0xf5ba9
movq 0x38(%rsp), %rdi
movl 0xc(%rsp), %esi
callq 0xe59a0
movq 0x38(%rsp), %rax
movq 0x10d0(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x38(%rsp), %rdi
movq 0x30(%rsp), %rsi
callq 0x473f0
testb $0x1, %al
jne 0xf5bbe
jmp 0xf5be2
movq 0x38(%rsp), %rdi
movl 0xc(%rsp), %esi
callq 0xe59a0
movq 0x38(%rsp), %rax
movq 0x11e0(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x38(%rsp), %rdi
movl 0xc(%rsp), %esi
callq 0xe59a0
movq 0x10(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
jmp 0xf5c05
jmp 0xf5c07
movq 0x38(%rsp), %rdi
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0xfc80
movq %rax, 0x20(%rsp)
movq 0x20(%rsp), %rax
movzbl (%rax), %eax
cmpl $0x20, %eax
jne 0xf5c96
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movzbl (%rax), %eax
movl %eax, %ecx
leaq 0x12ca8f(%rip), %rax    # 0x2226d0
testb $0x1, (%rax,%rcx)
jne 0xf5c5f
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
andq $0x40000000, %rax       # imm = 0x40000000
cmpq $0x0, %rax
je 0xf5c96
movq 0x38(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x3a750
movq %rax, (%rsp)
movq (%rsp), %rax
movzbl (%rax), %eax
cmpl $0x1, %eax
jne 0xf5c94
movq (%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
jmp 0xf5c96
jmp 0xf5c98
movq 0x38(%rsp), %rax
movq 0x118(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x28(%rsp), %rax
movzbl (%rax), %eax
cmpl $0xa, %eax
jne 0xf5d01
movq 0x38(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0xefdf0
movq %rax, 0x20(%rsp)
cmpq $0x0, 0x20(%rsp)
jne 0xf5ce7
movq 0x38(%rsp), %rax
movq 0x118(%rax), %rax
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x38(%rsp), %rdi
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rsi
callq 0x46b00
movq %rax, 0x40(%rsp)
jmp 0xf5d15
movq 0x38(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0x46b00
movq %rax, 0x40(%rsp)
movq 0x40(%rsp), %rax
addq $0x48, %rsp
retq
nop