// File: /workspace/github_c_makefile_star2_O3/BernardTatin[P]s7sh/s7.c
// Function: p_pip_ok
static bool p_pip_ok(s7_scheme *sc, opt_info *opc, s7_pointer s_func, s7_pointer car_x)
                {
                    s7_p_pip_t func;
                    s7_pointer obj, slot1, sig, checker = NULL;
                    opt_type_t op2 = OO_P;

                    func = s7_p_pip_function(s_func);
                    if (!func)
                        return(return_false(sc, car_x, __func__, __LINE__));

                    sig = c_function_signature(s_func);
                    if ((is_pair(sig)) &&
                            (is_pair(cdr(sig))) &&
                            (is_symbol(cadr(sig))))
                        checker = cadr(sig);

                    /* here we know cadr is a symbol */
                    slot1 = symbol_to_slot(sc, cadr(car_x));
                    if ((!is_slot(slot1)) ||
                            (has_methods(slot_value(slot1))) ||
                            (is_immutable(slot_value(slot1))))
                        return(return_false(sc, car_x, __func__, __LINE__));
                    if ((is_any_vector(slot_value(slot1))) &&
                            (vector_rank(slot_value(slot1)) > 1))
                        return(return_false(sc, car_x, __func__, __LINE__));

                    opc->v[1].p = slot1;
                    obj = slot_value(opc->v[1].p);
                    switch (type(obj))
                    {
                        case T_VECTOR:       op2 = (is_typed_vector(obj)) ? OO_TV : OO_PV; break;
                        case T_INT_VECTOR:   op2 = OO_IV; break;
                        case T_FLOAT_VECTOR: op2 = OO_FV; break;
                        case T_STRING:       op2 = OO_S;  break;
                        case T_BYTE_VECTOR:  op2 = OO_BV; break;
                        case T_PAIR: 	 op2 = OO_L;  break;
                        case T_LET:          op2 = OO_E;  break;
                        case T_HASH_TABLE:   op2 = OO_H;  break;
                        default:             op2 = OO_P;  break;
                    }

                    opc->v[3].p_pip_f = func;
                    if ((s7_p_pip_direct_function(s_func)) &&
                            (checker))
                    {
                        if ((is_normal_vector(obj)) && (checker == sc->is_vector_symbol))
                        {
                            if (is_typed_vector(obj))
                                opc->v[3].p_pip_f = typed_vector_set_p_pip_direct;
                            else opc->v[3].p_pip_f = vector_set_p_pip_direct;
                        }
                        else
                        {
                            if ((is_pair(obj)) && (checker == sc->is_pair_symbol))
                                opc->v[3].p_pip_f = s7_p_pip_direct_function(s_func);
                            else
                            {
                                s7_pointer val_type;
                                val_type = opt_arg_type(sc, cdddr(car_x));
                                if (val_type == cadddr(sig))
                                {
                                    if (((is_string(obj)) && (checker == sc->is_string_symbol)) ||
                                            ((is_float_vector(obj)) && (checker == sc->is_float_vector_symbol)) ||
                                            ((is_int_vector(obj)) && (checker == sc->is_int_vector_symbol)) ||
                                            ((is_byte_vector(obj)) && (checker == sc->is_byte_vector_symbol)))
                                        opc->v[3].p_pip_f = s7_p_pip_direct_function(s_func);
                                }
                            }
                        }
                    }
                    if (is_symbol(caddr(car_x)))
                    {
                        s7_pointer slot2;
                        int32_t start;
                        start = sc->pc;
                        slot2 = opt_integer_symbol(sc, caddr(car_x));
                        if (slot2)
                        {
                            opc->v[2].p = slot2;
                            if (is_step_end(slot2))
                                switch (type(obj))
                                {
                                    case T_VECTOR:
                                        if (denominator(slot_value(slot2)) <= vector_length(obj))
                                            opc->v[3].p_pip_f = (is_typed_vector(obj)) ? typed_vector_set_unchecked : vector_set_unchecked;
                                        break;

                                    case T_INT_VECTOR:
                                        if (denominator(slot_value(slot2)) <= vector_length(obj))
                                            opc->v[3].p_pip_f = int_vector_set_unchecked_p;
                                        break;

                                    case T_FLOAT_VECTOR:
                                        if (denominator(slot_value(slot2)) <= vector_length(obj))
                                            opc->v[3].p_pip_f = float_vector_set_unchecked_p;
                                        break;

                                    case T_STRING:
                                        if (denominator(slot_value(slot2)) <= string_length(obj))
                                            opc->v[3].p_pip_f = string_set_unchecked;
                                        break;

                                    case T_BYTE_VECTOR:
                                        if (denominator(slot_value(slot2)) <= string_length(obj))
                                            opc->v[3].p_pip_f = byte_vector_set_unchecked_p;
                                        break;
                                }

                            if (is_symbol(cadddr(car_x)))
                            {
                                s7_pointer val_slot;
                                val_slot = opt_simple_symbol(sc, cadddr(car_x));
                                if (val_slot)
                                {
                                    opc->v[4].p_pip_f = opc->v[3].p_pip_f;
                                    opc->v[3].p = val_slot;
                                    opc->v[0].fp = opt_p_pip_sss;
                                    return(oo_set_type_3(opc, 5, 1, 2, 3, op2, OO_I, OO_P));
                                }
                            }
                            else
                            {
                                if ((!is_pair(cadddr(car_x))) ||
                                        (is_proper_quote(sc, cadddr(car_x))))
                                {
                                    if (!is_pair(cadddr(car_x)))
                                        opc->v[4].p = cadddr(car_x);
                                    else opc->v[4].p = cadr(cadddr(car_x));
                                    opc->v[0].fp = opt_p_pip_ssc;
                                    return(oo_set_type_2(opc, 5, 1, 2, op2, OO_I));
                                }
                            }
                            if (cell_optimize(sc, cdddr(car_x)))
                            {
                                if (p_pip_ssf_combinable(sc, opc, start))
                                    return(true);
                                opc->v[0].fp = opt_p_pip_ssf;
                                opc->v[4].o1 = sc->opts[start];
                                opc->v[5].fp = sc->opts[start]->v[0].fp;
                                return(oo_set_type_2(opc, 6, 1, 2, op2, OO_I));
                            }
                        }
                    }
                    else /* not symbol caddr */
                    {
                        if ((int_optimize(sc, cddr(car_x))) &&
                                (cell_optimize(sc, cdddr(car_x))))
                        {
                            opc->v[0].fp = opt_p_pip_sff;
                            if ((obj) && (is_normal_vector(obj)))
                                return(oo_set_type_1(opc, 4, 1, op2));
                            return(oo_set_type_1(opc, 4, 1, op2));
                        }
                    }
                    return(return_false(sc, car_x, __func__, __LINE__));
                }

// Assembly:
cmpb $0x30, (%rdx)
jb 0xa45a8
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rcx, %r15
movq %rdx, %r12
movq 0x8(%rdx), %rcx
movq 0x20(%rcx), %rax
testq %rax, %rax
je 0xa4623
movq %rsi, %rbx
movq %rdi, %r14
cmpl $0x35, (%rax)
je 0xa45ab
movq 0x10(%rax), %rax
testq %rax, %rax
jne 0xa4598
jmp 0xa4623
xorl %eax, %eax
retq
movq 0x8(%rax), %rax
testq %rax, %rax
je 0xa4623
movq 0x38(%rcx), %r13
cmpb $0x1, (%r13)
jne 0xa45d7
movq 0x10(%r13), %rcx
cmpb $0x1, (%rcx)
jne 0xa45d7
movq 0x8(%rcx), %rcx
xorl %ebp, %ebp
cmpb $0xa, (%rcx)
cmoveq %rcx, %rbp
jmp 0xa45d9
xorl %ebp, %ebp
movq 0x10(%r15), %rcx
movq 0x8(%rcx), %rcx
movq 0x8(%r14), %rsi
movq 0x18(%rsi), %r8
movq 0x20(%rcx), %rdi
movl $0x18, %edx
cmpq %rdi, %r8
je 0xa460b
jle 0xa4606
movq 0x10(%rsi), %rsi
movq 0x18(%rsi), %r8
cmpq %r8, %rdi
jl 0xa45f9
cmpq %rdi, %r8
jne 0xa4634
movq (%rcx,%rdx), %rdi
cmpb $0x20, (%rdi)
jne 0xa4623
movq 0x10(%rdi), %rcx
movq (%rcx), %rdx
testl $0x41000000, %edx       # imm = 0x41000000
je 0xa4659
xorl %eax, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl $0x10, %edx
cmpb $0x1c, (%rsi)
jne 0xa460b
movq 0x8(%rsi), %rdi
testq %rdi, %rdi
je 0xa4653
cmpq %rcx, 0x8(%rdi)
je 0xa460f
movq 0x18(%rdi), %rdi
jmp 0xa4642
movq 0x10(%rsi), %rsi
jmp 0xa4639
movzbl %dl, %edx
leaq 0xa65bd(%rip), %rsi     # 0x14ac20
cmpb $0x1, (%rdx,%rsi)
jne 0xa467d
movq 0x18(%rcx), %rcx
movq 0x20(%rcx), %rcx
testq %rcx, %rcx
je 0xa467d
cmpq $0x1, 0x10(%rcx)
jg 0xa4623
movq %rdi, 0x8(%rbx)
movq 0x10(%rdi), %rdi
movzbl (%rdi), %edx
leal -0x13(%rdx), %ecx
cmpl $0x9, %ecx
ja 0xa46aa
leaq 0x63d6d(%rip), %rdx     # 0x108404
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movl $0x9, 0xc(%rsp)
jmp 0xa470b
cmpl $0x1, %edx
jne 0xa46b9
movl $0xb, 0xc(%rsp)
jmp 0xa470b
movl $0x0, 0xc(%rsp)
jmp 0xa470b
movl $0xc, 0xc(%rsp)
jmp 0xa470b
movl $0x4, 0xc(%rsp)
jmp 0xa470b
movl $0x5, 0xc(%rsp)
jmp 0xa470b
movb 0x6(%rdi), %cl
andb $0x2, %cl
shrb %cl
movzbl %cl, %ecx
leal 0x6(,%rcx,8), %ecx
movl %ecx, 0xc(%rsp)
jmp 0xa470b
movl $0xa, 0xc(%rsp)
jmp 0xa470b
movl $0x8, 0xc(%rsp)
movq %rax, 0x18(%rbx)
cmpb $0x30, (%r12)
jb 0xa4858
movq 0x8(%r12), %rax
movq 0x20(%rax), %rcx
testq %rcx, %rcx
je 0xa4858
movq %rcx, %rax
cmpl $0x36, (%rax)
je 0xa4742
movq 0x10(%rax), %rax
testq %rax, %rax
jne 0xa472f
jmp 0xa4858
testq %rbp, %rbp
je 0xa4858
cmpq $0x0, 0x8(%rax)
je 0xa4858
movzbl (%rdi), %eax
cmpl $0x1, %eax
je 0xa4787
cmpl $0x15, %eax
jne 0xa4790
cmpq 0x11b0(%r14), %rbp
jne 0xa4790
testb $0x2, 0x6(%rdi)
leaq -0x22424(%rip), %rcx    # 0x82353
leaq 0x3fa1(%rip), %rax      # 0xa871f
cmoveq %rcx, %rax
jmp 0xa4854
cmpq 0x1140(%r14), %rbp
je 0xa47ee
movq 0x10(%r15), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rsi
movq %rdi, 0x10(%rsp)
movq %r14, %rdi
callq 0xa844a
movq 0x10(%rsp), %rdi
movq 0x10(%r13), %rcx
movq 0x10(%rcx), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0xa4858
movzbl (%rdi), %eax
addl $-0x13, %eax
cmpl $0x5, %eax
ja 0xa4858
leaq 0x63c52(%rip), %rcx     # 0x10842c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpq 0x1190(%r14), %rbp
jne 0xa4858
jmp 0xa4825
xorl %eax, %eax
cmpl $0x36, (%rcx)
je 0xa4800
movq 0x10(%rcx), %rcx
testq %rcx, %rcx
jne 0xa47f0
jmp 0xa4854
movq 0x8(%rcx), %rax
jmp 0xa4854
cmpq 0x1090(%r14), %rbp
jne 0xa4858
jmp 0xa4825
cmpq 0x10c8(%r14), %rbp
jne 0xa4858
jmp 0xa4825
cmpq 0xfe8(%r14), %rbp
jne 0xa4858
cmpb $0x30, (%r12)
jb 0xa4847
movq 0x8(%r12), %rax
movq 0x20(%rax), %rcx
xorl %eax, %eax
testq %rcx, %rcx
je 0xa484f
cmpl $0x36, (%rcx)
je 0xa484b
movq 0x10(%rcx), %rcx
jmp 0xa4837
xorl %eax, %eax
jmp 0xa4854
movq 0x8(%rcx), %rax
movq 0x10(%rsp), %rdi
movq %rax, 0x18(%rbx)
movq 0x10(%r15), %rax
movq 0x10(%rax), %rsi
movq 0x8(%rsi), %rax
cmpb $0xa, (%rax)
jne 0xa48d7
movq %rdi, %r13
movslq 0x2258(%r14), %r12
movq %r14, %rdi
movq %rax, %rsi
callq 0x9f8a2
testq %rax, %rax
je 0xa4623
movq %rax, 0x10(%rbx)
testb $0x4, 0x3(%rax)
je 0xa4996
movq %r13, %rsi
movzbl (%r13), %ecx
addl $-0x13, %ecx
cmpl $0x5, %ecx
ja 0xa4996
leaq 0x63b94(%rip), %rdx     # 0x108444
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
cmpq 0x8(%rsi), %rax
jg 0xa4996
leaq 0x4456(%rip), %rax      # 0xa8d28
jmp 0xa4992
movq %r14, %rdi
callq 0x9fbc8
testb %al, %al
je 0xa4623
movq 0x10(%r15), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rsi
movq %r14, %rdi
callq 0xa2000
testb %al, %al
je 0xa4623
leaq 0x4775(%rip), %rax      # 0xa907f
movq %rax, (%rbx)
movabsq $0x100000004, %rax      # imm = 0x100000004
movq %rax, 0x60(%rbx)
movl $0x70, %eax
movl 0xc(%rsp), %ecx
jmp 0xa4aad
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
cmpq 0x8(%rsi), %rax
jg 0xa4996
leaq 0xa7b0(%rip), %rax      # 0xaf0ee
jmp 0xa4992
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
cmpq 0x8(%rsi), %rax
jg 0xa4996
testb $0x2, 0x6(%rsi)
leaq 0x44c4(%rip), %rcx      # 0xa8e1d
leaq 0x43ed(%rip), %rax      # 0xa8d4d
cmoveq %rcx, %rax
jmp 0xa4992
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
cmpq 0x8(%rsi), %rax
jg 0xa4996
leaq 0xa7bf(%rip), %rax      # 0xaf13a
jmp 0xa4992
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
cmpq 0x8(%rsi), %rax
jg 0xa4996
leaq 0x43a4(%rip), %rax      # 0xa8d36
movq %rax, 0x18(%rbx)
movq 0x10(%r15), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %r15
movq 0x8(%r15), %rsi
movzbl (%rsi), %eax
cmpl $0x1, %eax
je 0xa4a03
cmpl $0xa, %eax
jne 0xa4a80
movq 0x8(%r14), %rdi
callq 0xa56a4
testq %rax, %rax
je 0xa4a26
movq 0x18(%rbx), %rcx
movq %rcx, 0x20(%rbx)
movq %rax, 0x18(%rbx)
leaq 0x4451(%rip), %rax      # 0xa8e29
movq %rax, (%rbx)
movl 0xc(%rsp), %eax
movl %eax, 0x70(%rbx)
movl $0x1, 0x74(%rbx)
movabsq $0x300000005, %rax      # imm = 0x300000005
movq %rax, 0x60(%rbx)
xorl %ecx, %ecx
movl $0x78, %eax
jmp 0xa4aad
movq 0x8(%rsi), %rax
cmpq 0x17b0(%r14), %rax
jne 0xa4a26
movq 0x10(%rsi), %rax
cmpb $0x1, (%rax)
jne 0xa4a26
movq 0x10(%rax), %rcx
cmpq 0x110(%r14), %rcx
je 0xa4a7c
movq %r14, %rdi
movq %r15, %rsi
callq 0xa2000
testb %al, %al
je 0xa4623
movq %r14, %rdi
movq %rbx, %rsi
movl %r12d, %edx
callq 0xa8ec1
movl %eax, %ecx
movb $0x1, %al
testb %cl, %cl
jne 0xa4625
leaq 0x457b(%rip), %rax      # 0xa8fd5
movq %rax, (%rbx)
movq 0x2260(%r14,%r12,8), %rax
movq %rax, 0x20(%rbx)
movq (%rax), %rax
movq %rax, 0x28(%rbx)
movabsq $0x200000006, %rax      # imm = 0x200000006
jmp 0xa4a98
movq 0x8(%rax), %rsi
movq %rsi, 0x20(%rbx)
leaq 0x43ee(%rip), %rax      # 0xa8e79
movq %rax, (%rbx)
movabsq $0x200000005, %rax      # imm = 0x200000005
movq %rax, 0x60(%rbx)
movl 0xc(%rsp), %eax
movl %eax, 0x70(%rbx)
movl $0x1, %ecx
movl $0x74, %eax
movl %ecx, (%rbx,%rax)
movb $0x1, %al
jmp 0xa4625