// File: /workspace/github_c_makefile_star2_O1/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:
movq %rcx, %r8
movb $0x1, %al
cmpq %rcx, %rdx
jge 0xe0c52
movq %rsi, %r9
leaq -0x3052a(%rip), %rax    # 0xb06ac
cmpq %rax, (%rsi)
jne 0xe0c50
movq %rdx, %rcx
movq 0x8(%r9), %rax
movq 0x18(%r9), %rdx
movq 0x10(%rax), %rsi
movzbl (%rsi), %eax
movq 0x10(%rdx), %rdx
cmpb (%rdx), %al
jne 0xe0c50
movq 0x10(%r9), %r10
cmpq 0x20(%r9), %r10
jne 0xe0c50
pushq %rax
cmpl $0x13, %eax
je 0xe0c29
cmpl $0x15, %eax
jne 0xe0c43
leaq -0x583e9(%rip), %r10    # 0x88828
cmpq %r10, 0x28(%r9)
jne 0xe0c24
leaq -0x5848a(%rip), %r10    # 0x88794
cmpq %r10, 0x30(%r9)
je 0xe0c67
cmpl $0x13, %eax
jne 0xe0c43
leaq -0x57be6(%rip), %rax    # 0x8904a
cmpq %rax, 0x28(%r9)
jne 0xe0c43
leaq -0x57c92(%rip), %rax    # 0x88fab
cmpq %rax, 0x30(%r9)
je 0xe0c53
xorl %ecx, %ecx
xorl %eax, %eax
testb %cl, %cl
leaq 0x8(%rsp), %rsp
je 0xe0c52
xorl %eax, %eax
retq
testq %rcx, %rcx
js 0xe0c7b
cmpq %r8, 0x8(%rdx)
jge 0xe0c84
movq 0x1548(%rdi), %rax
jmp 0xe0ce0
testq %rcx, %rcx
js 0xe0c97
cmpq %r8, 0x8(%rdx)
jge 0xe0cd3
movq 0x1660(%rdi), %rax
jmp 0xe0ce0
movq 0x1550(%rdi), %rax
jmp 0xe0c9e
cmpq %r8, 0x8(%rsi)
jge 0xe0d25
movq 0x1550(%rdi), %rax
jmp 0xe0ce0
movq 0x1668(%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 0x71d77(%rip), %r8      # 0x152a48
jmp 0xe0d13
cmpq %r8, 0x8(%rsi)
jge 0xe0d25
movq 0x1668(%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 0x71d2d(%rip), %r8      # 0x152a40
callq 0xef7f
testq %rax, %rax
setne %al
xorl %ecx, %ecx
jmp 0xe0c47
movq %rcx, %r9
callq 0xa12f7
testq %rax, %rax
sete %cl
movb $0x1, %al
jmp 0xe0c47