// File: /workspace/github_c_makefile_star2_O1/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:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rcx, %r15
movq %rdx, %r12
movq %rsi, %rbx
movq %rdi, %r14
cmpb $0x30, (%rdx)
jb 0xab12d
movq 0x8(%r12), %rax
movq 0x20(%rax), %rcx
testq %rcx, %rcx
sete %dl
je 0xab129
cmpl $0x35, (%rcx)
je 0xab121
movq 0x10(%rcx), %rcx
testq %rcx, %rcx
sete %dl
je 0xab129
cmpl $0x35, (%rcx)
jne 0xab110
movq 0x8(%rcx), %rax
xorl %edx, %edx
jmp 0xab129
testb %dl, %dl
je 0xab12f
xorl %eax, %eax
testq %rax, %rax
je 0xab1df
movq 0x8(%r12), %rcx
movq 0x38(%rcx), %rbp
cmpb $0x1, (%rbp)
jne 0xab160
movq 0x10(%rbp), %rcx
cmpb $0x1, (%rcx)
jne 0xab160
movq 0x8(%rcx), %rcx
xorl %r13d, %r13d
cmpb $0xa, (%rcx)
cmoveq %rcx, %r13
jmp 0xab163
xorl %r13d, %r13d
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 0xab1cc
jle 0xab190
movq 0x10(%rsi), %rsi
movq 0x18(%rsi), %r8
cmpq %r8, %rdi
jl 0xab183
cmpq %rdi, %r8
je 0xab1cc
movl $0x10, %edx
cmpb $0x1c, (%rsi)
jne 0xab1cc
movq 0x8(%rsi), %rdi
testq %rdi, %rdi
sete %r9b
je 0xab1b8
cmpq %rcx, 0x8(%rdi)
je 0xab1bb
movq 0x18(%rdi), %rdi
jmp 0xab1a3
movq %r8, %rdi
testb %r9b, %r9b
je 0xab1d0
movq 0x10(%rsi), %rsi
cmpb $0x1c, (%rsi)
movq %rdi, %r8
je 0xab19f
movq (%rcx,%rdx), %rdi
cmpb $0x20, (%rdi)
jne 0xab1df
movq 0x10(%rdi), %rcx
testb $0x41, 0x3(%rcx)
je 0xab1f0
xorl %eax, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movzbl (%rcx), %edx
leaq 0xa7a26(%rip), %rsi     # 0x152c20
cmpb $0x1, (%rdx,%rsi)
jne 0xab214
movq 0x18(%rcx), %rcx
movq 0x20(%rcx), %rcx
testq %rcx, %rcx
je 0xab214
cmpq $0x1, 0x10(%rcx)
jg 0xab1df
movq %rdi, 0x8(%rbx)
movq 0x10(%rdi), %rcx
movq %rcx, 0x10(%rsp)
movzbl (%rcx), %edx
leal -0x13(%rdx), %ecx
cmpl $0x9, %ecx
ja 0xab246
leaq 0x66165(%rip), %rdx     # 0x111398
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movl $0x9, 0xc(%rsp)
jmp 0xab2ac
cmpl $0x1, %edx
jne 0xab255
movl $0xb, 0xc(%rsp)
jmp 0xab2ac
movl $0x0, 0xc(%rsp)
jmp 0xab2ac
movl $0xc, 0xc(%rsp)
jmp 0xab2ac
movl $0x4, 0xc(%rsp)
jmp 0xab2ac
movl $0x5, 0xc(%rsp)
jmp 0xab2ac
movq 0x10(%rsp), %rcx
movb 0x6(%rcx), %cl
andb $0x2, %cl
shrb %cl
movzbl %cl, %ecx
leal 0x6(,%rcx,8), %ecx
movl %ecx, 0xc(%rsp)
jmp 0xab2ac
movl $0xa, 0xc(%rsp)
jmp 0xab2ac
movl $0x8, 0xc(%rsp)
movq %rax, 0x18(%rbx)
movq %r12, %rdi
callq 0xb64eb
testq %rax, %rax
sete %cl
testq %r13, %r13
sete %dl
orb %cl, %dl
jne 0xab3b2
movq 0x10(%rsp), %rcx
movzbl (%rcx), %ecx
cmpl $0x1, %ecx
je 0xab2f0
cmpl $0x15, %ecx
jne 0xab2fd
cmpq 0x11b0(%r14), %r13
je 0xab393
cmpb $0x1, %cl
jne 0xab2fd
cmpq 0x1140(%r14), %r13
je 0xab3ae
movq 0x10(%r15), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rsi
movq %r14, %rdi
callq 0xaf307
movq 0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq 0x10(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0xab3b2
movq 0x10(%rsp), %rax
movzbl (%rax), %eax
leal -0x13(%rax), %ecx
cmpl $0x5, %ecx
ja 0xab3b2
leaq 0x66082(%rip), %rdx     # 0x1113c0
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
cmpq 0x1190(%r14), %r13
je 0xab389
cmpl $0x16, %eax
je 0xab372
cmpl $0x18, %eax
je 0xab380
cmpl $0x17, %eax
jne 0xab3b2
cmpq 0x1090(%r14), %r13
je 0xab389
cmpl $0x18, %eax
je 0xab380
cmpl $0x16, %eax
jne 0xab3b2
cmpq 0x10c8(%r14), %r13
je 0xab389
cmpl $0x18, %eax
jne 0xab3b2
cmpq 0xfe8(%r14), %r13
jne 0xab3b2
movq %r12, %rdi
callq 0xb64eb
jmp 0xab3ae
movq 0x10(%rsp), %rax
testb $0x2, 0x6(%rax)
leaq -0x22b7b(%rip), %rcx    # 0x88828
leaq 0x42a0(%rip), %rax      # 0xaf64a
cmoveq %rcx, %rax
movq %rax, 0x18(%rbx)
movq 0x10(%r15), %rax
movq 0x10(%rax), %rsi
movq 0x8(%rsi), %rax
cmpb $0xa, (%rax)
jne 0xab433
movslq 0x2258(%r14), %r12
movq %r14, %rdi
movq %rax, %rsi
callq 0xa639f
testq %rax, %rax
je 0xab1df
movq %rax, 0x10(%rbx)
testb $0x4, 0x3(%rax)
je 0xab50b
movq 0x10(%rsp), %rcx
movzbl (%rcx), %ecx
addl $-0x13, %ecx
cmpl $0x5, %ecx
ja 0xab50b
leaq 0x65fd1(%rip), %rdx     # 0x1113d8
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rsp), %rcx
cmpq 0x8(%rcx), %rax
jg 0xab50b
leaq 0x4825(%rip), %rax      # 0xafc53
jmp 0xab507
movq %r14, %rdi
callq 0xa66f0
testb %al, %al
je 0xab1df
movq 0x10(%r15), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rsi
movq %r14, %rdi
callq 0xa8bbb
testb %al, %al
je 0xab1df
leaq 0x4b44(%rip), %rax      # 0xaffaa
movq %rax, (%rbx)
movabsq $0x100000004, %rax      # imm = 0x100000004
movq %rax, 0x60(%rbx)
movl $0x70, %eax
movl 0xc(%rsp), %ecx
jmp 0xab63c
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rsp), %rcx
cmpq 0x8(%rcx), %rax
jg 0xab50b
leaq 0xb079(%rip), %rax      # 0xb6518
jmp 0xab507
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rsp), %rcx
cmpq 0x8(%rcx), %rax
jg 0xab50b
movq 0x10(%rsp), %rax
testb $0x2, 0x6(%rax)
leaq 0x4884(%rip), %rcx      # 0xafd48
leaq 0x47ad(%rip), %rax      # 0xafc78
cmoveq %rcx, %rax
jmp 0xab507
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rsp), %rcx
cmpq 0x8(%rcx), %rax
jg 0xab50b
leaq 0xb079(%rip), %rax      # 0xb6564
jmp 0xab507
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rsp), %rcx
cmpq 0x8(%rcx), %rax
jg 0xab50b
leaq 0x475a(%rip), %rax      # 0xafc61
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 0xab577
cmpl $0xa, %eax
jne 0xab60f
movq %r14, %rdi
callq 0xac2d6
testq %rax, %rax
je 0xab59a
movq 0x18(%rbx), %rcx
movq %rcx, 0x20(%rbx)
movq %rax, 0x18(%rbx)
leaq 0x4808(%rip), %rax      # 0xafd54
movq %rax, (%rbx)
movabsq $0x300000005, %rax      # imm = 0x300000005
movq %rax, 0x60(%rbx)
movl 0xc(%rsp), %eax
movl %eax, 0x70(%rbx)
movl $0x1, 0x74(%rbx)
xorl %ecx, %ecx
movl $0x78, %eax
jmp 0xab63c
movq 0x8(%rsi), %rcx
cmpq 0x17b0(%r14), %rcx
jne 0xab59a
movq 0x10(%rsi), %rcx
cmpb $0x1, (%rcx)
jne 0xab59a
movq 0x10(%rcx), %rcx
cmpq 0x110(%r14), %rcx
je 0xab603
movq %r14, %rdi
movq %r15, %rsi
callq 0xa8bbb
testb %al, %al
je 0xab1df
movq %r14, %rdi
movq %rbx, %rsi
movl %r12d, %edx
callq 0xafdec
movl %eax, %ecx
movb $0x1, %al
testb %cl, %cl
jne 0xab1e1
leaq 0x4932(%rip), %rax      # 0xaff00
movq %rax, (%rbx)
movq 0x2260(%r14,%r12,8), %rax
movq %rax, 0x20(%rbx)
movq 0x2260(%r14,%r12,8), %rax
movq (%rax), %rax
movq %rax, 0x28(%rbx)
movabsq $0x200000006, %rax      # imm = 0x200000006
movq %rax, 0x60(%rbx)
movl 0xc(%rsp), %eax
movl %eax, 0x70(%rbx)
jmp 0xab632
cmpb $0x1, %al
jne 0xab60f
movq 0x10(%rsi), %rax
movq 0x8(%rax), %rsi
movl 0xc(%rsp), %ecx
movq %rsi, 0x20(%rbx)
leaq 0x4786(%rip), %rax      # 0xafda4
movq %rax, (%rbx)
movabsq $0x200000005, %rax      # imm = 0x200000005
movq %rax, 0x60(%rbx)
movl %ecx, 0x70(%rbx)
movl $0x1, %ecx
movl $0x74, %eax
movl %ecx, (%rbx,%rax)
movb $0x1, %al
jmp 0xab1e1