// File: /workspace/github_c_makefile_star2_O3/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 0xd83ad
movq %rdx, %rcx
movq %rsi, %rax
leaq -0x2ebff(%rip), %rdx    # 0xa9784
cmpq %rdx, (%rsi)
jne 0xd83ab
movq 0x8(%rax), %rdx
movq 0x18(%rax), %r10
movq 0x10(%rdx), %rsi
movzbl (%rsi), %r9d
movq 0x10(%r10), %rdx
cmpb (%rdx), %r9b
jne 0xd83ab
movq 0x10(%rax), %r10
cmpq 0x20(%rax), %r10
je 0xd83b1
xorl %ebx, %ebx
movl %ebx, %eax
popq %rbx
retq
cmpl $0x13, %r9d
je 0xd83ee
cmpl $0x15, %r9d
jne 0xd83ab
leaq -0x56071(%rip), %r9     # 0x82353
cmpq %r9, 0x28(%rax)
jne 0xd83ab
leaq -0x56112(%rip), %r9     # 0x822bf
cmpq %r9, 0x30(%rax)
jne 0xd83ab
testq %rcx, %rcx
js 0xd841c
cmpq %r8, 0x8(%rdx)
jge 0xd8461
movq 0x1660(%rdi), %rax
jmp 0xd847d
leaq -0x5587c(%rip), %r9     # 0x82b79
cmpq %r9, 0x28(%rax)
jne 0xd83ab
leaq -0x55928(%rip), %r9     # 0x82ada
cmpq %r9, 0x30(%rax)
jne 0xd83ab
testq %rcx, %rcx
js 0xd8425
cmpq %r8, 0x8(%rdx)
jge 0xd8470
movq 0x1548(%rdi), %rax
jmp 0xd847d
movq 0x1668(%rdi), %rax
jmp 0xd842c
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 0x725e9(%rip), %r8      # 0x14aa48
jmp 0xd84b0
cmpq %r8, 0x8(%rsi)
jge 0xd84c0
movq 0x1668(%rdi), %rax
jmp 0xd847d
cmpq %r8, 0x8(%rsi)
jge 0xd84c0
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 0x72590(%rip), %r8      # 0x14aa40
callq 0xe1fe
testq %rax, %rax
setne %bl
jmp 0xd83ad
movq %rcx, %r9
callq 0x9a933
testq %rax, %rax
jne 0xd83ad
jmp 0xd83ab