// File: /workspace/github_c_makefile_star2_O2/BernardTatin[P]s7sh/s7.c
// Function: opt_do_copy
static bool opt_do_copy(s7_scheme *sc, opt_info *o, s7_int start, s7_int stop)
                {
                    s7_pointer (*fp)(opt_info *o);

                    if (start >= stop) return(true);
                    fp = o->v[0].fp;                            /* o->v[6].p_pi_f is getter, o->v[5].p_pip_f is setter */
                    if ((fp == opt_p_pip_sso) &&
                            (type(slot_value(o->v[1].p)) == type(slot_value(o->v[3].p))) &&
                            (o->v[2].p == o->v[4].p))
                    {
                        s7_pointer dest, source;
                        dest = slot_value(o->v[1].p);
                        source = slot_value(o->v[3].p);
                        if ((is_normal_vector(dest)) &&
                                ((o->v[5].p_pip_f == vector_set_p_pip_direct) && (o->v[6].p_pi_f == vector_ref_p_pi_direct)))
                        {
                            if (start < 0)
                                return(out_of_range(sc, sc->vector_set_symbol, wrap_integer1(sc, 2), wrap_integer2(sc, start), its_negative_string));
                            if (stop > vector_length(source))
                                return(out_of_range(sc, sc->vector_ref_symbol, wrap_integer1(sc, 2), wrap_integer2(sc, stop), its_too_large_string));
                            if (stop > vector_length(dest))
                                return(out_of_range(sc, sc->vector_set_symbol, wrap_integer1(sc, 2), wrap_integer2(sc, stop), its_too_large_string));
                        }
                        else
                        {
                            if ((is_string(dest)) &&
                                    ((o->v[5].p_pip_f == string_set_p_pip_direct) && (o->v[6].p_pi_f == string_ref_p_pi_direct)))
                            {
                                if (start < 0)
                                    return(out_of_range(sc, sc->string_set_symbol, wrap_integer1(sc, 2), wrap_integer2(sc, start), its_negative_string));
                                if (stop > string_length(source))
                                    return(out_of_range(sc, sc->string_ref_symbol, wrap_integer1(sc, 2), wrap_integer2(sc, stop), its_too_large_string));
                                if (stop > string_length(dest))
                                    return(out_of_range(sc, sc->string_set_symbol, wrap_integer1(sc, 2), wrap_integer2(sc, stop), its_too_large_string));
                            }
                            else return(false); /* pair copy needs length here and is kinda stupid in this context */
                        }
                        /* float|int|byte-vectors are in opt_dotimes below (opt_float|int_any_nr loops, but I don't think they matter -- s7 users know about copy! */
                        if (copy_direct(sc, dest, source, start, stop, start))
                            return(true);
                    }
                    return(false);
                }

// Assembly:
pushq %rbx
movq %rcx, %r8
movb $0x1, %bl
cmpq %rcx, %rdx
jge 0xab291
movq %rdx, %rcx
movq %rsi, %rax
leaq -0x243e7(%rip), %rdx    # 0x86e80
cmpq %rdx, (%rsi)
jne 0xab28f
movq 0x8(%rax), %rdx
movq 0x18(%rax), %r10
movq 0x10(%rdx), %rsi
movzbl (%rsi), %r9d
movq 0x10(%r10), %rdx
cmpb (%rdx), %r9b
jne 0xab28f
movq 0x10(%rax), %r10
cmpq 0x20(%rax), %r10
je 0xab295
xorl %ebx, %ebx
movl %ebx, %eax
popq %rbx
retq
cmpl $0x13, %r9d
je 0xab2d2
cmpl $0x15, %r9d
jne 0xab28f
leaq -0x4288c(%rip), %r9     # 0x68a1c
cmpq %r9, 0x28(%rax)
jne 0xab28f
leaq -0x42906(%rip), %r9     # 0x689af
cmpq %r9, 0x30(%rax)
jne 0xab28f
testq %rcx, %rcx
js 0xab300
cmpq %r8, 0x8(%rdx)
jge 0xab345
movq 0x1660(%rdi), %rax
jmp 0xab361
leaq -0x422b4(%rip), %r9     # 0x69025
cmpq %r9, 0x28(%rax)
jne 0xab28f
leaq -0x4232e(%rip), %r9     # 0x68fb8
cmpq %r9, 0x30(%rax)
jne 0xab28f
testq %rcx, %rcx
js 0xab309
cmpq %r8, 0x8(%rdx)
jge 0xab354
movq 0x1548(%rdi), %rax
jmp 0xab361
movq 0x1668(%rdi), %rax
jmp 0xab310
movq 0x1550(%rdi), %rax
movq 0x8(%rax), %rsi
movq 0x1f00(%rdi), %rax
movq $0x2, 0x8(%rax)
movq 0x1f00(%rdi), %rdx
movq 0x1f08(%rdi), %rax
movq %rcx, 0x8(%rax)
movq 0x1f08(%rdi), %rcx
movq 0x6e705(%rip), %r8      # 0x119a48
jmp 0xab394
cmpq %r8, 0x8(%rsi)
jge 0xab3a4
movq 0x1668(%rdi), %rax
jmp 0xab361
cmpq %r8, 0x8(%rsi)
jge 0xab3a4
movq 0x1550(%rdi), %rax
movq 0x8(%rax), %rsi
movq 0x1f00(%rdi), %rax
movq $0x2, 0x8(%rax)
movq 0x1f00(%rdi), %rdx
movq 0x1f08(%rdi), %rax
movq %r8, 0x8(%rax)
movq 0x1f08(%rdi), %rcx
movq 0x6e6ac(%rip), %r8      # 0x119a40
callq 0xcb8f
testq %rax, %rax
setne %bl
jmp 0xab291
movq %rcx, %r9
callq 0x7bd24
testq %rax, %rax
jne 0xab291
jmp 0xab28f